文本格式如下:(其中/实际并不存在,只是为使例子容易看一些) 空格/点号/制表符/X坐标/空格/空格/Y坐标/空格/空格/空格/Z坐标 
      A   制表符  1.1             2.2                  3.3 问题: 
共有19个这样的文本文件,其中点号A在这19个文本中至多出现4次(0 <出现次数 <=4),我现在要把相同点的XYZ坐标两两相减。例如点A在19个文件中共出现4次,分别位于文件1,文件3,文件7和文件11中,那我则要将文件1与文件3中点A的X坐标相减,文件1与文件7中的X相减,文件1与文件11中的X相减,文件3与文件7中的X相减.... ,运行完毕应该有6个差值。出现4次则应有6个差值,出现3次则应有3个差值,出现2次则应有1个差值,出现1次则差值为其本身。计算完毕之后要生成一个差值文件,其格式如下:

点号/空格/文件M/空格/文件N/空格/差值现在想请教大家高效一些的算法,能有代码则更好。

解决方案 »

  1.   

    文件M与文件N是为了说明这个差值是那两个文件中具有相同点号的点的差值。对于Y和Z坐标的计算,也是如此。
      

  2.   

    从文件中读取数据我已经教过你了。假定你已经知道如何将数据存入 Access 数据库了:Dim cn As ADODB.Connection, rsPoints As ADODB.Recordset, rsData As ADODB.Recordset
    Dim fileID(3) As String, x(3) As Single, y(3) As Single, z(3) As Single
    Dim n as Integer, i As Integer, j As IntegerSet cn = New ADODB.Connection
    cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=你的数据库名.mdb"
    Set rsPoints = cn.Execute("Select Distinct pointID From 你的数据库表名")
    Open "d:\data\point_x_deff.txt" For Output As #1
    Open "d:\data\point_y_deff.txt" For Output As #2
    Open "d:\data\point_z_deff.txt" For Output As #3
    Do Until rsPoints.EOF
       Set rsData = cn.Execute("Select * From 你的数据库表名 Where pointID='" & rsPoints!pointID & "'")
       n = 0
       Do Until rsData.EOF
          fileID(n) = rsData!fileID 
          x(n) = Val(rsData!x)
          y(n) = Val(rsData!y)
          z(n) = Val(rsData!z)
          rsData.MoveNext
       Loop
       rsData.Close   If n = 1 Then
          Print #1, rsPoints!pointID & " " & fileID(0) & " " & fileID(0) & " " & rsData!x
          Print #2, rsPoints!pointID & " " & fileID(0) & " " & fileID(0) & " " & rsData!y
          Print #3, rsPoints!pointID & " " & fileID(0) & " " & fileID(0) & " " & rsData!z
       Else
          For i = 0 to n - 1
             For j = i + 1 to n
                Print #1, rsPoints!pointID & " " & fileID(i) & " " & fileID(j) & " " & Format(x(i) - x(j), "STANDARD")
                Print #2, rsPoints!pointID & " " & fileID(i) & " " & fileID(j) & " " & Format(y(i) - y(j), "STANDARD")
                Print #3, rsPoints!pointID & " " & fileID(i) & " " & fileID(j) & " " & Format(z(i) - z(j), "STANDARD") 
             Next j
          Next i
       End If
       
       rsPoints.MoveNext
    Loop
    Close #1
    Close #2
    Close #3
    rsPoints.Close
    Set rsPoints = Nothing
    cn.Close
    Set cn = Nothing