从DAT文件中的特定位置提取字符串

时间:2018-05-21 23:02:17

标签: string vba position extract binaryfiles

大家好我是VBA编程的新手,但我已经使用Excel 2年了,我想构建一个程序,可以从每一行(pos 15)的特定位置提取一个String(30个pos长)并且将它放入我的工作表中的单元格中,听起来很简单,但我需要从包含22,157,838条记录的DAT存档中提取每一行的每一个字符串,我必须在列上放置1,048,575条记录,并将偏移量放到下一列的开头,I非常感谢任何帮助,这是我的代码:

<table>

谢谢:)

2 个答案:

答案 0 :(得分:0)

...测试

Sub FirstMACR_ATV()

    Const RECS_PER_COL As Long = 1000000

    Dim myFile As String, arr(), i As Long
    Dim textline As String, c As Range

    ReDim arr(1 To RECS_PER_COL, 1 To 1)

    Set c = ThisWorkbook.Sheets("destination").Range("A1")

    myFile = "C:\Users\s3850630\Desktop\EXPMST.dat"

    Open myFile For Input As #1
    Do Until EOF(1)
        Line Input #1, textline
        i = i + 1
        arr(i, 1) = Mid(textline, 15, 30)

        'hit row limit?
        If i = RECS_PER_COL Then
            c.Resize(RECS_PER_COL, 1).Value = arr 'Dump data
            ReDim arr(1 To RECS_PER_COL, 1 To 1)
            i = 0
            Set c = c.Offset(0, 1)   'move over one column
        End If
    Loop
    Close #1

    If i > 0 Then c.Resize(i, 1).Value = arr

End Sub

答案 1 :(得分:0)

我的答案就像蒂姆威廉姆斯的唯一不同(伟大的思想像我一样)。我添加了一条Application.StatusBar消息,以缓解那些将要等待处理的穷人的想法。我也一次写下所有数据。

您可能想要试用MAX_ROWS_PER_COLUMN。 100K可能表现优于1000k(对于日常使用,处理时间将大致相同)。无论如何,316 MB的Excel文件并不理想。我建议使用数据库。

Sub FirstMACR_ATV()
    Dim t As Long: t = Timer
    Const MAX_ROWS_PER_COLUMN AS Long = 1000000
    Dim r As Long, c As Long
    Dim myFile As String, textline As String
    Dim results() As Variant
    myFile = "C:\Users\s3850630\Desktop\EXPMST.dat"

    Open myFile For Input As #1
    Do Until EOF(1)
        Line Input #1, textline
        r = r + 1

        If r > MAX_ROWS_PER_COLUMN Or c = 0 Then
            c = c + 1
            r = 1
            ReDim Preserve results(1 To MAX_ROWS_PER_COLUMN, 1 To c)
        End If

        If r = 50000 Then Application.StatusBar = "Processing record #" & (r * c) & " " & Round(Timer - t, 2) & " Seconds"
        results(r, c) = Mid(textline, 15, 30)
    Loop
    Close #1
    Worksheets("Sheet1").Range("A1").Resize(UBound(results), UBound(results, 2)).Value = results
    Debug.Print Round(Timer - t, 2)
End Sub