Показать полную графическую версию : Как заменить части строки по списку?
Имеется код, осуществляющий двойную замену в файле (abc123 на xyz123 и abc789 на xyz789 ):
var fso = new ActiveXObject("Scripting.FileSystemObject");
var pattern1 = /abc123/g;var pattern1a = 'xyz123';
var pattern2 = /abc789/g;var pattern2a = 'xyz789';
var myInputTextStream = fso.OpenTextFile('C:\\test1.txt', 1, true);
var myOutputTextStream = fso.OpenTextFile('C:\\test2.txt', 2, true);
myOutputTextStream.Write(
myInputTextStream
.ReadAll()
.replace(pattern1, pattern1a)
.replace(pattern2, pattern2a)
)
myInputTextStream.Close();
myOutputTextStream.Close();
abc и xyz - фиксированные паттерны, а 123 и 789 это нектороые числа
Как сделать так чтобы можно было не перечислять паттерны замены в скрипте, а использовать список таких чисел C:\list.txt, разумеется элементов списка будет гораздо больше двух (abc и xyz при этом остаются фиксированными)?
greg zakharov
21-03-2018, 17:07
Как сделать так чтобы можно было не перечислять паттерны замены в скрипте
Если не усложнять себе жизнь, проще вообще взять sed (https://github.com/mbuilov/sed-windows) и не парить мозг.
E:\sandbox> echo abc123 abc789 | sed y/abc/xyz/
xyz123 xyz789
То же применимо и к файлам. Кстати, примеры файлов где?
что-то я не совсем понял как это работает
наверное штука сильная, но надо изучать
В принципе спасибо
greg zakharov
22-03-2018, 08:40
что-то я не совсем понял как это работает
наверное штука сильная, но надо изучать
Изучать там особо нечего, достаточно почитать руководство (man page). А вот примеров файлов от Вас не последовало, поэтому код выше лишь показывает трансформацию того, что выводит echo в консоли. Допустим, есть файл следущего содержания:
строка 1 abc123 abc789
строка 2 abc123 abc789
строка 3 abc123 abc789
строка 4 abc123 abc789
строка 5 abc123 abc789
строка 6 xyz123 abc789
строка 7 abc123 xyz789
строка 8 xyz123 xyz789
Чтобы заменить все abc на xyz достаточно команды:
sed -i y/abc/xyz/ file.txt
В итоге файл становится:
строка 1 xyz123 xyz789
строка 2 xyz123 xyz789
строка 3 xyz123 xyz789
строка 4 xyz123 xyz789
строка 5 xyz123 xyz789
строка 6 xyz123 xyz789
строка 7 xyz123 xyz789
строка 8 xyz123 xyz789
greg zakharov,
теперь у меня получилось вообще поиметь дело с этим sed, да, это сильная штука.
Но у меня строение файла иное,
file.txt:
abc123
abc456
abc789
abc101
abc678
abc876
abc321
......
и согласно list.txt:
456
101
321
надо получить:
abc123
xyz456
abc789
xyz101
abc678
abc876
xyz321
......
для megaloman:
"физика" задачи такая:
Есть страница куда регулярно добавляются книги с описаниями. Каждое такое описание заключено внутри тега <div id="div_file_123123">...</div>
У меня есть прошлогодняя версия этой страницы из которой я извлек список номеров, включенных в id (типа 123123) и я хочу по всем этим номерам сделать у текущей страницы замену
id="div_file_123123 на class=none id="div_file_123123
при этом добавить в css-стили страницы строку div.none { display: none }
скрыв таким образом все что было в прошлом году и уже прочтено
Все упирается в список.
megaloman
22-03-2018, 15:36
var inFile='Z:\\Box_In\\test1.txt';
var abc='abc';
var xyz='xyz';
var listFile='Z:\\Box_In\\list.txt'
var outFile='Z:\\Box_In\\test2.txt';
var FSO=WScript.CreateObject("Scripting.FileSystemObject");
try {Txt=FSO.OpenTextFile(inFile, 1, false);}
catch (err) {
if (err != 0) {
WScript.Echo("Open file "+inFile+"\nerror: "+err.number+"\n"+err.description);
WScript.Quit();
}
}
var strContent = Txt.ReadAll();
Txt.Close();
try {Txt=FSO.OpenTextFile(listFile, 1, false);}
catch (err) {
if (err != 0) {
WScript.Echo("Open file "+listFile+"\nerror: "+err.number+"\n"+err.description);
WScript.Quit();
}
}
var strRepl;
while (!Txt.eof) {
try {strRepl = Txt.ReadLine()}
catch (e) {if (e != 0) break}
strRepl=strRepl.replace(new RegExp(' ', 'g'), '');
strContent=strContent.replace(new RegExp(abc+strRepl, 'g'), xyz+strRepl);
}
Txt.Close();
try {Txt=FSO.OpenTextFile(outFile, 2, true);}
catch (err) {
if (err != 0) {
WScript.Echo("Open file "+outFile+"\nerror: "+err.number+"\n"+err.description);
WScript.Quit();
}
}
Txt.Write(strContent);
Txt.Close();
Попутно предложение: почему бы вместо того, чтобы делать файл list.txt сделать xls-таблицу и обрабатывать Ваш файл макросом из-под Excel?
megaloman,
БОЛЬШОЕ СПАСИБО, все работает!
Идея с макросом конечно интересная - если только знать VBA .... (но увыыыыы )
megaloman
22-03-2018, 20:54
почему бы вместо того, чтобы делать файл list.txt сделать xls-таблицу и обрабатывать Ваш файл макросом из-под Excel »
Супер! Все сработало. Спасибо!
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.