读书人

怎么实现此文件操作

发布时间: 2012-01-16 23:36:51 作者: rapoo

如何实现此文件操作?
文本格式如下:(其中/实际并不存在,只是为使例子容易看一些)

空格/点号/制表符/X坐标/空格/空格/Y坐标/空格/空格/空格/Z坐标
A 制表符 1.1 2.2 3.3

问题:

1.如何将点号、X坐标、Y坐标、Z坐标分离开来?

2.在我按行读取文本内容,并将点号、X坐标、Y坐标、Z坐标分别存入相应的数组Pts(),X(),Y(),Z()时,我用str1(t)="A制表符1.1",然后用str2(i)=Split(str1(t),vbTab)或是str2(i)=Split(str1(t),chr(9))将点号与X坐标分开,可每次调试都会出现str1(t)下标越界错误,请问该如何解决?

3.共有19个这样的文本文件,其中点号A在这19个文本中至多出现4次(0<出现次数<=4),我需要将具有相同点号的XYZ坐标都提取出来,求这些XYZ坐标的平均值。比如,点号A一共出现了4次,则我需要求其X的平均值
avrX=(x1+x2+x3+x4)/4,假如点A总共只出现2次,则其X坐标的平均值为avrX=(x1+x2)/2,对于Y和Z的平均值也是这样求。求出平均值之后,需要将19个文件中,该点所有的XYZ坐标都改成平均值avrX,avrY,avrZ,如何实现?对于这个问题,有解决方法、思想就行,因为我觉得我现在的办法打开关闭文件次数较多,内存开销较大,文本搜索的效率不高,当然能有示例代码就更好不过了。

以下是我对于第3个问题的办法:
首先遍历19个文件,将点号提取出来,存入目标数组Pts(0 to n)中,且使点号在数组中具有唯一性,然后for i=0 to n , 从Pts(0)开始,与19个文件逐一比较,发现点号与Pts(0)相同的,则提取其XYZ坐标,分别存入数组
X(),Y(),Z()中,当遍历完19个文件之后,求平均值[X(0)+X(1)+...+X(n)]/n ,并存入坐标平均值数组avrX(0)中(Y和Z的操作也如此),接着从Pts(1)开始遍历19个文件,直到Pts(n)。最后又从Pts(0)开始,又遍历19个文件,发现相同点号的,将其XYZ坐标改为平均值avrXYZ,呵呵,是不是很麻烦,可我目前也只能想出这个办法了,因为你不知道点A会出现在这19个文件的哪个里头,所以希望大家指教。

[解决办法]
1 关于字段分割
Open "yourfile.txt" For Input As #1
Dim strTmp As String
Dim strLine() As String
Dim n As Long
n = -1
Do Until EOF(1)
n = n + 1
Line Input #1, strTmp
strTmp = Replace(strTmp, vbTab, Space(1))
Do While Instr(strTmp, Space(2))
strTmp = Replace(strTmp, Space(2), Space(1))
Loop
strLine = Split(strTmp, Space(1))
Redim Preserve Pts(n)
Redim Preserve x(n)
Redim Preserve y(n)
Redim Preserve z(n)
Pts(n) = strLine(0)
x(n) = strLine(1)
y(n) = strLine(2)
z(n) = strLine(3)
Loop
Close #1

2 关于求平均
Dim i As Long, j As Integer, m As integer
Dim PtName() As String, Ocur() As Integer, xavr() As Single, yavr() As Single, zavr() As Single
m = -1
For i = 0 To Ubound(Pts)
If m < 0 Then
Redim PtName(0)
Redim Ocur(0)
Redim xavr(0)
Redim yavr(0)
Redim zavr(0)
PtName(0) = Pts(i)
Ocur(0) = 1
xavr(0) = x(i)
yavr(0) = y(i)
zavr(0) = z(i)
m = 0
Else
For j = 0 to m - 1
If PtNmae = Pts(i)
Ocur(j) = Ocur(j) + 1
xavr(j) = (xavr(j) + x(i)) / Ocur(j)
yavr(j) = (yavr(j) + y(i)) / Ocur(j)
zavr(j) = (zavr(j) + z(i)) / Ocur(j)
Exit For
End If
Next j
If j = m Then
Redim Preserve PtName(m) 'New Point
Redim Preserve Ocur(m)
Redim Preserve xavr(m)
Redim Preserve yavr(m)
Redim Preserve zavr(m)
PtName(m) = Pts(i)
Ocur(m) = 1
xavr(m) = x(i)
yavr(m) = y(i)
zavr(m) = z(i)
m = m + 1
End If
End If
Next i
[解决办法]
处理不定空格:

VBScript code
's 为单行文本dim l1 as long,l2 as longs = trim$(replace(s,vbtab, " "))l2 = len(s)do    l1 = l2    s = replace(s, "  ", " ")    l2 = len(s)loop while l2<l1'split(s, " ") 就得到长度为 4 的数组 

读书人网 >VB

热点推荐