主题:[讨论]如何用VB修改文本文件里面的数据并保存为另一文本文件?
boyamyxia
[专家分:0] 发布于 2008-01-29 16:32:00
假设有一个TXT文件,里面的内容如下:
[BEGIN]
类型=0x6
数据=(112.89398,132.50898),(32.89396,309.50879),(321.89418,213.50847),(65.89448,120.50840),(432.89452,878.50827),232.89370,123.50827),(38.89355,121.50834),
[END]
[BEGIN]
类型=0x1
标识=JYD
数据=(12.04876,263.76517)
[END]
....
每个括号()内的数据相对于一组数X1,Y1,例如(12.04876,263.76517),X1=12.04876, Y1=263.76517。
想用一个VB的程序把以上数据(每个括号内的数据)用以下公式计算出新的X2, Y2
X2=a+X1*Cos(X1-b)*sin(Y1-c)+X1
Y2=d+Y1*sin(Y1-b)*cos(Y1-c)+Y1
然后替代原来括号内的数据,再保存为文本文件(TXT)。
希望可以有一个载入TXT的按钮,修改TXT的按钮。还可以有一个地方可以输入a,b,c,d的数值。
包括所有括号内的数据。
不知道是否可以实现以上功能呢?如何可以实现以上功能呢?
谢谢
最后更新于:2008-01-29 16:57:00
回复列表 (共5个回复)
沙发
一江秋水 [专家分:9680] 发布于 2008-01-29 17:27:00
可以用二维数组来读入数据
用InputBox来输入a\b\c的数值
修改后的数据先转换为字符,再加上括号和逗号,保存到一个字符型变量中,最后将这个变量中的数据存盘
板凳
家人 [专家分:6760] 发布于 2008-01-29 19:47:00
Private Sub Command1_Click()
Dim sFile As String '文件的数据
Dim fName As String '文件路径
Dim h As String '文件号
Dim re As RegExp '正则对象
Dim mhs As MatchCollection '匹配数据的集合
Dim mh As Match '匹配的对象
'读取文件中的数据到变量sFile中
fName = "D:\test.txt"
h = FreeFile
Open fName For Binary As h
sFile = Space(LOF(h))
Get h, , sFile
Close
'通过正则表达式找到匹配的数据并计算替换
Set re = New RegExp
re.Global = True
re.Pattern = "\d*[\.]?\d+,\d*[\.]?\d+"
If re.Test(sFile) Then
Set mhs = re.Execute(sFile)
For Each mh In mhs
'这儿你的abcd都选2了
sFile = Replace(sFile, mh.Value, GetValue(mh.Value, 2, 2, 2, 2))
Next
End If
'写到新的文本文件中
fName = "D:\rtest.txt"
h = FreeFile
Open fName For Output As h
Print #h, sFile
Close
End Sub
'这个是要替换的值
Function GetValue( _
ByVal inpStr As String, _
ByVal a As Double, ByVal b As Double, _
ByVal c As Double, ByVal d As Double _
) As String
Dim x() As String
Dim tmp(1) As Double
Dim i As Long
x = Split(inpStr, ",")
tmp(0) = a + x(0) * Cos(x(0) - b) * Sin(x(1) - c) + x(0)
tmp(1) = d + x(1) * Sin(x(1) - b) * Cos(x(1) - c) + x(1)
GetValue = tmp(0) & "," & tmp(1)
End Function
3 楼
boyamyxia [专家分:0] 发布于 2008-01-30 08:50:00
[quote]
Private Sub Command1_Click()
Dim sFile As String '文件的数据
Dim fName As String '文件路径
Dim h As String '文件号
Dim re As RegExp '正则对象
Dim mhs As MatchCollection '匹配数据的集合
Dim mh As Match '匹配的对象
'读取文件中的数据到变量sFile中
fName = "D:\test.txt"
h = FreeFile
Open fName For Binary As h
sFile = Space(LOF(h))
Get h, , sFile
Close
'通过正则表达式找到匹配的数据并计算替换
Set re = New RegExp
re.Global = True
re.Pattern = "\d*[\.]?\d+,\d*[\.]?\d+"
If re.Test(sFile) Then
Set mhs = re.Execute(sFile)
For Each mh In mhs
'这儿你的abcd都选2了
sFile = Replace(sFile, mh.Value, GetValue(mh.Value, 2, 2, 2, 2))
Next
End If
'写到新的文本文件中
fName = "D:\rtest.txt"
h = FreeFile
Open fName For Output As h
Print #h, sFile
Close
End Sub
'这个是要替换的值
Function GetValue( _
ByVal inpStr As String, _
ByVal a As Double, ByVal b As Double, _
ByVal c As Double, ByVal d As Double _
) As String
Dim x() As String
Dim tmp(1) As Double
Dim i As Long
x = Split(inpStr, ",")
tmp(0) = a + x(0) * Cos(x(0) - b) * Sin(x(1) - c) + x(0)
tmp(1) = d + x(1) * Sin(x(1) - b) * Cos(x(1) - c) + x(1)
GetValue = tmp(0) & "," & tmp(1)
End Function[/quote]
非常感谢 家人 的帮助。
我在VB6里面试了一下,还有几个问题想问一下。
1. 算出来后的结果和预想的不一样,意思是用X2=a+X1*Cos(X1-b)*sin(Y1-c)+X1 算出来的X2代替括号内每组数的前半部分,Y2=d+Y1*sin(Y1-b)*cos(Y1-c)+Y1 算出来的Y2代替括号内每组数的后半部分。例如(12.04876,263.76517),X1=12.04876, Y1=263.76517,经过运算后,X2代替X1,Y2代替Y1.
2. 不知道是否可以优化这个程序,因为文本文件较大的时候会死机。
再次感谢。
4 楼
家人 [专家分:6760] 发布于 2008-01-30 12:10:00
1.X2Y2值的计算过程全部在GetValue这个函数中
这个函数通过传入的12.04876,263.76517这样结构的数据,按逗号拆分为X1Y1,对应代码中的x(0)和x(1),计算后的X2Y2,对应代码中的tmp(0)和tmp(1),你可以仔细分析一下,看看计算不对的原因
2.这个代码是一下将文本内容全部读入到一个string中来,用正则匹配替换。如果文本太大,计算机所要配给其的内存也要足够大,文件大了可能会造成死机的现象,一般的情况下,你可以在循环中加上doevents试试,如果依然死机。就要考虑其它的处理方式了
5 楼
boyamyxia [专家分:0] 发布于 2008-01-31 15:32:00
[quote]1.X2Y2值的计算过程全部在GetValue这个函数中
这个函数通过传入的12.04876,263.76517这样结构的数据,按逗号拆分为X1Y1,对应代码中的x(0)和x(1),计算后的X2Y2,对应代码中的tmp(0)和tmp(1),你可以仔细分析一下,看看计算不对的原因
2.这个代码是一下将文本内容全部读入到一个string中来,用正则匹配替换。如果文本太大,计算机所要配给其的内存也要足够大,文件大了可能会造成死机的现象,一般的情况下,你可以在循环中加上doevents试试,如果依然死机。就要考虑其它的处理方式了
[/quote]
谢谢帮忙,我在
For Each mh In mhs
'输入abcdef的值
sFile = Replace(sFile, mh.Value, GetValue(mh.Value,....
后加了doevents,(也不知道加的位置对不对),但再次执行的时候,就没有死机现象,但文件过了很久还是没有处理完,被处理的文件大概有3.5Mb。
对于计算的结果,仔细看了一下,原因是公式有些小错,修改后就对了。哈哈,真是不小心啊。
再次感谢家人
我来回复