回 帖 发 新 帖 刷新版面

主题:[讨论]如何用VB修改文本文件里面的数据并保存为另一文本文件?

假设有一个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的数值。 

包括所有括号内的数据。
不知道是否可以实现以上功能呢?如何可以实现以上功能呢?
谢谢

回复列表 (共5个回复)

沙发

可以用二维数组来读入数据
用InputBox来输入a\b\c的数值
修改后的数据先转换为字符,再加上括号和逗号,保存到一个字符型变量中,最后将这个变量中的数据存盘

板凳


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 楼

[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 楼

1.X2Y2值的计算过程全部在GetValue这个函数中
 这个函数通过传入的12.04876,263.76517这样结构的数据,按逗号拆分为X1Y1,对应代码中的x(0)和x(1),计算后的X2Y2,对应代码中的tmp(0)和tmp(1),你可以仔细分析一下,看看计算不对的原因

2.这个代码是一下将文本内容全部读入到一个string中来,用正则匹配替换。如果文本太大,计算机所要配给其的内存也要足够大,文件大了可能会造成死机的现象,一般的情况下,你可以在循环中加上doevents试试,如果依然死机。就要考虑其它的处理方式了

5 楼

[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。

对于计算的结果,仔细看了一下,原因是公式有些小错,修改后就对了。哈哈,真是不小心啊。

再次感谢家人

我来回复

您尚未登录,请登录后再回复。点此登录或注册