Извлечение строки из определенной позиции из файла DAT - PullRequest
0 голосов
/ 22 мая 2018

Привет всем, я новичок в программировании VBA, но я использую Excel в течение 2 лет, я хочу создать программу, которая может извлекать строку (длиной 30 позиций) из определенной позиции каждой строки (позиция 15) иПоместите это в ячейку на моем рабочем листе, звучит легко, но мне нужно извлечь каждую строку каждой строки из архива DAT, который содержит 22 157 838 записей, я должен разместить 1 048 575 записей в столбце и смещение до начала следующего столбца.очень ценю любую помощь, вот мой код:

Sub FirstMACR_ATV()
    Dim myFile As String
    textline As String
    CUENTA As String
    myFile = "C:\Users\s3850630\Desktop\EXPMST.dat"
    Open myFile For Input As #1
    Do Until EOF(1)
        Line Input #1, textline
        CUENTA = Mid(textline, 15, 30)
End Sub

Спасибо:)

Ответы [ 2 ]

0 голосов
/ 22 мая 2018

Мой ответ такой же, как у Тима Уильямса, только другой (великие умы думают как мой).Я добавил сообщение Application.StatusBar, чтобы облегчить сознание бедного парня, которому придется ждать, пока это не обработается.Я также записываю все данные сразу.

Возможно, вы захотите поэкспериментировать с MAX_ROWS_PER_COLUMN.100К может работать лучше, чем 1000К (для ежедневного использования время обработки будет примерно таким же).В любом случае файл Excel объемом 316 МБ не является идеальным.Я рекомендую использовать базу данных.

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
0 голосов
/ 22 мая 2018

Проверено ...

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
...