Как удалить пустые строки из большого файла TXT с помощью Excel VBA? - PullRequest
0 голосов
/ 25 сентября 2018

Я пытаюсь импортировать большой файл TXT в файл Excel с помощью VBA.Файл с разделителями трубы.Но исходный файл в некотором роде запутан тем, что есть случайные разрывы строк, которые не позволяют мне правильно импортировать файлы.

COLUMN1|COLUMN2|COLUMN3
DataA1|DataA2|DataTextA3

DataTextA3Continued

DataB1|DataB2|DataTextB3

Технически не должно быть возврата каретки между DataTextA3 и DataTextA3Continued, но это файл, который я получаю.Как мне удалить это в VBA?Я попытался заменить, используя vbCrLf, но файл большой (20 МБ), и он дает сбой Excel.Ценим помощь!

Спасибо!

Код ниже.

Sub ReplaceStringInFile()

Dim sBuf As String
Dim sTemp As String
Dim iFileNum As Integer
Dim sFileName As String

' Edit as needed
sFileName = Application.ActiveWorkbook.Path + "\DATAFILE" + Format(Now(), "yyyymmdd") + ".txt"

iFileNum = FreeFile
Open sFileName For Input As iFileNum

Do Until EOF(iFileNum)
    Line Input #iFileNum, sBuf
    sTemp = sTemp & sBuf & vbCrLf
Loop
Close iFileNum

sTemp = Replace(sTemp, vbCrLf, "THAT")

iFileNum = FreeFile
Open sFileName For Output As iFileNum
Print #iFileNum, sTemp
Close iFileNum

End Sub

1 Ответ

0 голосов
/ 25 сентября 2018

Если дополнительные символы новой строки всегда связаны с последним столбцом, я бы сконцентрировался на разделителях каналов, а не на строках.«Запись» будет состоять из 3 полей, поэтому прочитайте весь файл в буфер, а затем предположите, что каждому третьему элементу необходимо заменить любые новые строки.Как то так:

Public Sub ReplaceStringInFile()
    Dim filepath As String
    ' Edit as needed
    filepath = Application.ActiveWorkbook.Path + "\DATAFILE" + Format(Now(), "yyyymmdd") + ".txt"

    Dim handle As Integer
    handle = FreeFile
    Open filepath For Input As #handle
    Dim buffer As String
    'Read the entire file.
    buffer = Input(LOF(handle), handle)
    Close #handle

    handle = FreeFile
    Open filepath For Output As #handle

    Dim lines() As String
    lines = Split(buffer, "|")
    Dim idx As Long
    'This is your output buffer.
    Dim record(0 To 2) As String
    'I'd probably add more bounds checking here, but this should give the gist.
    For idx = LBound(lines) To UBound(lines) - 2 Step 3
        record(0) = lines(idx)
        record(1) = lines(idx + 1)
        'Do your replacement here.
        record(2) = Trim$(Replace$(lines(idx + 2), vbCrLf, " "))
        Print #handle, Join(record, "|")
    Next

    Close #handle
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...