原文件内容如下(文件很大,约有15万行):
2001110100 25325.0
2001110101 25635.0
2001110102 26035.0
2001110103 26345.0
2001110104 26700.0
2001110105 26955.0
2001110106 27130.0
2001110107 27170.0
2001110108 27170.0
2001110109 27070.0
2001110110 26850.0
2001110111 26580.0
2001110112 26320.0
2001110113 26045.0
……
……
……
怎样将文件里第二列的每个数据乘以固定值(如0.32)并将结果输出为另一个文件?
格式如下:(保留一位小数)
2001110100 8104.0
2001110101 8203.2
……
……
……多谢!!!

解决方案 »

  1.   

    15万行的话,可能要考虑怎样提高效率了。就逻辑来说倒简单,循环读取每行,然后用split分割(或其他方法如检测空格等),即可得到后半部分,剩下的事情就是数据类型转换再计算了。
      

  2.   

    以5~10M作为一个Block来读写文件,效率是最高的。
      

  3.   

    15万行对于现在的计算机也没有多大,大约3.3M吧,一次性读入内存处理会快得多。
    Private Sub Command1_Click()
        Dim istr As String
        Dim iistr() As String
        Dim ijstr() As String
        Open "d:\11xx.txt" For Input As #1
        Open "d:\11xx-1.txt" For Output As #2
        
        istr = Input(LOF(1), 1)
        iistr = Split(istr, vbCrLf)
        For i = 0 To UBound(iistr)
            ijstr = Split(iistr(i))
            If UBound(ijstr) < 1 Then Exit For
            ijstr(1) = FormatNumber(ijstr(1) * 0.35, 1, vbTrue, vbFalse, vbFalse)
            iistr(i) = Join(ijstr)
        Next
        istr = Join(iistr, vbCrLf)
        Print #2, istr
        Close
        MsgBox "OK"
    End Sub
      

  4.   

    保存的时候用二进制文件保存,第一个数为Long型,第二个数为Double型,不要保存为字符串。这样可以读取指定字节的Double数据。如果保存为字符串,免不了要用VB的函数,慢了。
      

  5.   

    参考下面这个:
    Option Explicit
    Private Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (ByRef Destination As Any, ByRef Source As Any, ByVal Length As Long)'写二进制文件
    Private Sub Command1_Click()
            Dim a(), b()
            Dim FileNumber As Long, i As Long
            a = Array(2001110100, 2001110101, 2001110102, 2001110103, 2001110104, 2001110105, 2001110106, 2001110107, 2001110108, 2001110109, 2001110110, 2001110111, 2001110112, 2001110113)
            b = Array(25325#, 25635#, 26035#, 26345#, 26700#, 26955#, 27130#, 27170#, 27170#, 27070#, 26850#, 26580#, 26320#, 26045#)
            FileNumber = FreeFile
            Open "c:\SourceFile.txt" For Binary As #FileNumber
            For i = 0 To UBound(a)
                Put #FileNumber, , CLng(a(i))
                Put #FileNumber, , CDbl(b(i))
            Next
            Close #FileNumber
            
    End Sub'读二进制文件
    Private Sub Command2_Click()
            'Dim a(), b()
            Dim FileNumber As Long, i As Long, j As Long
            Dim a As Long, b As Double
            Dim c(1 To 4) As Byte, d(1 To 8) As Byte
            FileNumber = FreeFile
            Open "c:\SourceFile.txt" For Binary As #FileNumber
            j = 0
            For i = 1 To LOF(FileNumber) Step 12
                Get #FileNumber, i, c(1)
                Get #FileNumber, i + 1, c(2)
                Get #FileNumber, i + 2, c(3)
                Get #FileNumber, i + 3, c(4)
                Get #FileNumber, i + 4, d(1)
                Get #FileNumber, i + 5, d(2)
                Get #FileNumber, i + 6, d(3)
                Get #FileNumber, i + 7, d(4)
                Get #FileNumber, i + 8, d(5)
                Get #FileNumber, i + 9, d(6)
                Get #FileNumber, i + 10, d(7)
                Get #FileNumber, i + 11, d(8)
                'a = CLng("&H" & Hex(c(4)) & Hex(c(3)) & Hex(c(2)) & Hex(c(1)))
                'b = CDbl("&H" & Hex(d(1)) & Hex(d(2)) & Hex(d(3)) & Hex(d(4)) & Hex(d(5)) & Hex(d(6)) & Hex(d(7)) & Hex(d(8)))
                CopyMemory a, c(1), 4
                CopyMemory b, d(1), 8
                Debug.Print a, b '这里的a和b可分别保存到一个数组中,然后将b乘以0.32后,将这2个数组保存到另外一个二进制文件中,方法如Command1的代码
            Next
            Close #FileNumber
    End Sub
      

  6.   


    Dim i As Long
        Dim strText As String
        Dim strLines() As String
        Dim strFields() As String
        
        '读文件
        Open App.Path & "\file1.txt" For Binary As #1
        strText = Input(LOF(1), 1)
        Close #1
        strLines = Split(strText, vbCrLf)
        strText = vbNullString
        '第2列乘0.32
        For i = 0 To UBound(strLines)
            strFields = Split(strLines(i), " ")
            strLines(i) = strFields(0) & " " & VBA.FormatNumber(strFields(1) * 0.32, 1, vbFalse, vbFalse, vbFalse)
            If (i Mod 1000) = 0 Then DoEvents
        Next
        strText = Join(strLines, vbCrLf)
        Erase strLines
        '保存结果
        Open App.Path & "\file2.txt" For Binary As #1
        Put #1, , strText
        Close