Пахнет регулярными выражениями.
Djdfy пишет:где Х- это любая цифра
и кусок из файла:
Djdfy пишет:19906.37|0.00|0.00|19906.37
1) Вижу, что X это не любая цифра, а цифра, точка или дефис. (добавьте, если еще чего упустил)
2) RD1 это не начало строки, как вы указываете... ну да ладно
3) Самое важное. Можно организовать все просто (проигнорировав пп. 1-2), если справедливы следующие условия замены:
После RD1|(что угодно, но не "|")|(что угодно, но не "|")| надо добавить "20|"
После RD2|(что угодно, но не "|")|(что угодно, но не "|")| надо добавить "30|"
После RD3|(что угодно, но не "|")|(что угодно, но не "|")| надо добавить "31|"
Я правильно переформулировал условия?
Если да, то вот примерно такие у вас будут регулярные выражения:
dim re, str
set re = CreateObject("VBScript.RegExp")
re.Pattern = "(RD1\|[^\|]+\|[^\|]+\|)"
str = "RD1|010|18210102010013000110|108.00|0.00|0.00|108.00|"
WScript.Echo re.replace(str, "$1ля-ля|")
Вопрос выбрасывания пустых строк и конвертации в txt это отдельная подзадачка.
Вот пример конвертации файла из rtf в текст CP866:
const wdFormatText = 2
dim sCurFolder : sCurFolder = Mid(WScript.ScriptFullName, 1, Len(WScript.ScriptFullName) - Len(WScript.ScriptName))
dim sFileIn : sFileIn = sCurFolder & "1.rtf" 'Подопытный
dim sFileOut : sFileOut = sCurFolder & "1.txt" 'Результат
dim oFS : set oFS = WScript.CreateObject("Scripting.FileSystemObject")
dim oW : set oW = WScript.CreateObject("Word.Application")
With oW.Documents.Open(sFileIn)
.SaveAs sFileOut, wdFormatText, , , , , , , , , , 866
' Sub SaveAs([FileName], [FileFormat], [LockComments], [Password], [AddToRecentFiles], [WritePassword], [ReadOnlyRecommended], [EmbedTrueTypeFonts], [SaveNativePictureFormat], [SaveFormsData], [SaveAsAOCELetter], [Encoding], [InsertLineBreaks], [AllowSubstitutions], [LineEnding], [AddBiDiMarks])
.Close
End With
oW.Quit
Общий алгоритм действий:
1) Как либо выбираем rtf-файл (логично положить все файлы в одну папку, а потом программно перебрать по одному), конвертим-сохраняем его в 866 txt.
2) Открываем получившийся файл, читаем построчно и меняем (по 3 разных replace() на строку) RD-вхождения. Результаты склеиваем в новый текст.
3) Видимо в том же цикле проверяем, не пуста ли строка "^\s*$", и если да, пропускаем (не добавляем к результирующему тексту).
4) Перезаписываем файл получившимся текстом. Если текст большой (ну не знаю, несколько сотен MB или просто на глаз тормозит), можно не накапливать текст в памяти, а тут же писать обработанные строки в другой файл - он будет финальным, а тот что сохранен Word'ом, удаляем.
Если кто видит в алгоритме методические огрехи, поправьте пожалуйста. У меня есть подозрение, что у OpenTextFile() будут проблемы с чтением записью CP866, но может и нет - заменяем не там где русский текст, должно как прочитаться, так и записаться? Не было случая реализовать полностью.
И вообще, видимо лучше все обработать прямо внутри открытого Word'ом документа. Опять же не было опыта - как там строчки перебирать?