PDA

Показать полную графическую версию : [решено] Замена символов на другие в огромном файле


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

Anonymоus
30-09-2012, 05:59
Как и чем можно сделать такую простую операцию »
sed (http://gnuwin32.sourceforge.net/packages/sed.htm) из пакета GNU Coreutils поможет вам. Использование - читайте --help.

megaloman
30-09-2012, 13:28
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
огромное спасибо за 2ой вариант!

Iska
30-09-2012, 16:28
megaloman, как-то сложно организовано чтение/запись. Почему не просто:
Do Until objTSIn.AtEndOfStream
objTSOut.WriteLine(objTSIn.ReadLine() & strChar)
Loop

?

megaloman
30-09-2012, 18:02
Iska, Не хотел использовать WriteLine, так как при этом в конец строки автоматом пишется Cr Lf, что приводит к лишней пустой строке в конце текстового файла, меня это угнетает. Можно, конечно, объединить 2 строки и другой Do, как сделано у Вас, но это не принципиально, делал этот скрипт из старого с другими целями. Спасибо за вопрос, можете предложить иной вариант? Do Until F1.AtEndOfStream
F2.Write BegTop + F1.ReadLine + EndBottom
BegTop = vbCrLf
Loop
Пример обрабатываемого файла (http://forum.oszone.net/attachment.php?attachmentid=88132&d=1349014822)

А вот вариант, где создание .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
Iska, Не хотел использовать WriteLine, так как при этом в конец строки автоматом пишется Cr Lf, что приводит к лишней пустой строке в конце текстового файла, меня это угнетает. »
Спасибо, ясно. Я, напротив, стараюсь приводить файлы к единообразному виду, стало быть — с CrLf и в последней строке.




© OSzone.net 2001-2012