Удалить лишний разрыв строки, написанный с помощью TextStream.WriteLine()

У меня есть следующий код vba, который записывает элементы в ArrayList в файл с TextStream.

Sub WriteListAsCSV(list As Object, filePath As String)
    Dim fso As New FileSystemObject
    Dim ts As TextStream
    Set ts = fso.CreateTextFile(filePath, True)
    Dim line As Variant
    For Each line In list
        ts.WriteLine (line)
   Next line
   ts.Close
End Sub

Проблема в том, что я получаю дополнительный разрыв строки в конце файла.

Я могу сделать следующее, но я не хочу проверять в каждом цикле этот единственный разрыв строки.

Sub WriteListAsCSV(list As Object, filePath As String)
    Dim fso As New FileSystemObject
    Dim ts As TextStream
    Set ts = fso.CreateTextFile(filePath, True)
    Dim line As Variant
    Dim i As Integer
    For i = 0 To list.Count
        line = list(i)
        ts.Write (line)
        'If not last line
        If Not i = list.Count Then
            'Write blankline
            ts.WriteLine()
        End If
   Next
   ts.Close
End Sub

Есть ли способ удалить один символ назад, например кнопку Backspace в VBA? Или еще один хитрый трюк, чтобы сделать это?


vba
person Min Naing Oo    schedule 29.08.2014    source источник
comment
как небольшое упрощение: For i = 0 To list.Count-1 ts.WriteLine (line) Next ts.Write (line)   -  person Stef    schedule 29.08.2014
comment
Почему вы не хотите проверять каждую итерацию?   -  person Jean-François Corbett    schedule 29.08.2014
comment
@Jean-FrançoisCorbett Я думаю, что будет быстрее выполнить команду кнопки возврата (или переместить курсор файла, как в C, Java, и удалить символ разрыва строки) в конце цикла, чем проверять в каждом цикле, является ли это последней итерацией. Я новичок в vba, поэтому я просто из любопытства :)   -  person Min Naing Oo    schedule 01.09.2014


Ответы (1)


Идея

Моя идея заключалась в том, чтобы удалить последние символы, соответствующие разрыву строки, то есть Chr(10) или Chr(13), а иногда и то и другое, используя длину файла.

Как сделать

Пока я проверял, как использовать функцию, я нашел это: Удалить последний файл возврата каретки, который точно соответствует моей идее... < br>Может быть, посмотрите, это довольно ясно.

EDIT (см. комментарий @ Siddharth Rout)
Измененная и прокомментированная версия кода (на случай, если ссылка не работает. Я не беру кредит на этот код)

Set objFSO = CreateObject("Scripting.FileSystemObject")   
Set objFile = objFSO.OpenTextFile("path\to\file", 1)     ' -- 1:read

strFile = objFile.ReadAll
objFile.Close

' We check if the two last characters correspond to a linebreak:
If Right(strFile, 2) = vbCrLf Then 
    ' If so, we remove those charaters:
    strFile = Left(strFile, Len(strFile)- 2)
    Set objFile = objFSO.OpenTextFile("path\to\file", 2) ' -- 2:write
    objFile.Write strFile
    objFile.Close
End If

Я не уверен, что это более элегантный способ, но он кажется довольно правильным. Надеюсь, что это работает для вас.

person smagnan    schedule 29.08.2014
comment
Я понимаю, что вам нужно не копировать его, но на самом деле имеет смысл добавить соответствующий отрывок из этой ссылки здесь. Для будущих посетителей было бы полезно, если бы ссылка, которую вы дали, умерла;) - person Siddharth Rout; 29.08.2014
comment
@SiddharthRout Хороший совет. Не стесняйтесь редактировать/комментировать, если считаете, что это можно улучшить. - person smagnan; 29.08.2014
comment
+1 за ваши старания :) - person Siddharth Rout; 29.08.2014
comment
Спасибо! тем более, что вы являетесь ведущим участником VBA ^^ - person smagnan; 29.08.2014