Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Замена символов на другие в огромном файле (http://forum.oszone.net/showthread.php?t=243652)

Megatron13 30-09-2012 04:43 1996867

Замена символов на другие в огромном файле
 
Здравствуйте! У меня внезапная проблема возникла. Есть txt файл в котором несколько миллионов строк. Да да миллионов. мне нужно просто добавить 1 символ в конец каждой строки но ни одно виденное мной приложение с этим не справлялось из-за огромного объема входных данных. Так вот у меня вопрос. Как и чем можно сделать такую простую операцию?
З.ы. Возможно я написал не в тот раздел, но другого подходящего я не нашел.

Anonymоus 30-09-2012 05:59 1996875

Цитата:

Цитата Megatron13
Как и чем можно сделать такую простую операцию »

sed из пакета GNU Coreutils поможет вам. Использование - читайте --help.

megaloman 30-09-2012 13:28 1996977

vbs-скрипт
Код:

    InFile = "D:\Примеры макроса\Для тестирования 10000.txt"        ' Путь к текстовому файлу
   
    Set FSO = CreateObject("Scripting.FileSystemObject")
   
    EndBottom = "}"                                    ' Вставляем символ(ы) в конец каждой строки
    InSave = 1                                          ' =0 -Не сохраним копию исходного файла, не 0 -сохраним
   
' Если надо сохранить исходный файл в .bak
   
    If InSave <> 0 Then
        On Error Resume Next
        Set F1 = FSO.GetFile(InFile)
        If Err.Number = 0 Then
            F1.Copy InFile + ".bak"
            F1.Close
        End If
    End If

' Читаем исходный файл, переписываем строки в 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) + "  Обработка начата" + Chr(13) + Chr(10)
        Do While Not F1.AtEndOfStream
            iString = F1.ReadLine
            F2.Write BegTop + iString + EndBottom
            BegTop = vbCrLf
        Loop
        F1.Close
        F2.Close
       
        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" + Chr(13) + Chr(10)
        End If
Else
    Messa = Messa + "Ошибка при открытии файла " + Chr(13) + Chr(10) + InFile + ".tmp" + Chr(13) + Chr(10) + Err.Description + Chr(13) + Chr(10)
End If

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


Megatron13 30-09-2012 14:57 1997037

огромное спасибо за 2ой вариант!

Iska 30-09-2012 16:28 1997112

megaloman, как-то сложно организовано чтение/запись. Почему не просто:
Код:

Do Until objTSIn.AtEndOfStream
        objTSOut.WriteLine(objTSIn.ReadLine() & strChar)
Loop

?

megaloman 30-09-2012 18:02 1997170

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)


Iska 01-10-2012 06:03 1997500

Цитата:

Цитата megaloman
Iska, Не хотел использовать WriteLine, так как при этом в конец строки автоматом пишется Cr Lf, что приводит к лишней пустой строке в конце текстового файла, меня это угнетает. »

Спасибо, ясно. Я, напротив, стараюсь приводить файлы к единообразному виду, стало быть — с CrLf и в последней строке.


Время: 02:03.

Время: 02:03.
© OSzone.net 2001-