Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  

Показать сообщение отдельно

Ветеран


Contributor


Сообщения: 2728
Благодарности: 1697

Профиль | Отправить PM | Цитировать


Iska, Не хотел использовать WriteLine, так как при этом в конец строки автоматом пишется Cr Lf, что приводит к лишней пустой строке в конце текстового файла, меня это угнетает. Можно, конечно, объединить 2 строки и другой Do, как сделано у Вас, но это не принципиально, делал этот скрипт из старого с другими целями. Спасибо за вопрос, можете предложить иной вариант?
Код: Выделить весь код
        Do Until F1.AtEndOfStream
            F2.Write BegTop + F1.ReadLine + EndBottom
            BegTop = vbCrLf
        Loop
Пример обрабатываемого файла

А вот вариант, где создание .bak файла сделано экономнее с точки зрения места на диске и времени
Код: Выделить весь код
InFile = "D:\Примеры макроса\Для тестирования 10000.txt"        ' Путь к текстовому файлу
    
Set FSO = CreateObject("Scripting.FileSystemObject")
    
EndBottom = "}"                                     ' Вставляем символ(ы) в конец каждой строки
InSave = 1                                          ' =0 -Не сохраним копию исходного файла, не 0 -сохраним

' Читаем исходный файл, переписываем строки в tmp-файл, переименовываем tmp
Set F1 = FSO.OpenTextFile(InFile, 1, False)

On Error Resume Next
Set F2 = FSO.OpenTextFile(InFile + ".tmp", 2, True)

BegTop = ""
If Err.Number = 0 Then
        Messa = CStr(Time) + "  Обработка начата" + vbCrLf
        Do Until F1.AtEndOfStream
            iString = F1.ReadLine
            F2.Write BegTop + iString + EndBottom
            BegTop = vbCrLf
'             F2.WriteLine F1.ReadLine + EndBottom
        Loop
        F1.Close
        F2.Close
            
' Если надо сохранить исходный файл в .bak
    
        If InSave <> 0 Then
            On Error Resume Next
            FSO.MoveFile InFile, InFile + ".bak"
            If Err.Number = 0 Then
                FSO.MoveFile InFile + ".tmp", InFile
            Else
                Messa = Messa + CStr(Time) + "  Не удалось создать .Bak  " + Err.Description + vbCrLf
            End If
        Else
            On Error Resume Next
            FSO.CopyFile InFile + ".tmp", InFile, True
            If Err.Number = 0 Then
                FSO.DeleteFile InFile + ".tmp", True
            Else
                Messa = Messa + CStr(Time) + "  Не удалось скопировать TMP " + Err.Description + vbCrLf
            End If
        End If
Else
    Messa = Messa + "Ошибка при открытии файла " + vbCrLf + InFile + ".tmp" + vbCrLf + Err.Description + vbCrLf
End If

Messa = Messa + CStr(Time) + "  Обработка закончена" + vbCrLf
L = MsgBox(Messa, 0, "Обработка " + InFile)

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 01-10-2012 в 05:51.


Отправлено: 18:02, 30-09-2012 | #6