Войти

Показать полную графическую версию : Правка текстового файла


mxm199
03-07-2012, 13:57
Доброго всем времени суток, подскажите пожалуйста - имеется текстовый файл, много-много строк, примерно такой -
---
текст текст текст 1111111111;
текст2 текст2 текст2 2222222222;
...
---
вопрос - каким образом можно добавить в начало каждой строки одно и тоже слово, а последнее слово в каждой строке (номер) немного видоизменить ?
т.е. на выходе хотелось видеть -
---
СЛОВО текст текст текст ФАЙЛ 1111111111
СЛОВО текст2 текст2 текст2 ФАЙЛ 2222222222
...
---

вообще мне это нужно, что бы получить батник spisok.cmd такого вида
---
@echo текст текст текст > c:\spisok\1111111111
@echo текст2 текст2 текст2 > c:\spisok\2222222222
---
ну и естественно, после запуска этого батника получаю много-много файлов, содержащих каждый свой текст.

Заранее спасибо.

mxm199
03-07-2012, 15:17
не, текст везде по длине и блокам у всех совершенно разный (

mxm199
04-07-2012, 10:26
текст и с пробелами и с точками, точкой запятой, полный набор символов )

Anonymоus
04-07-2012, 10:53
А зачем, собственно, использовать один батник для генерации другого, если всё можно сделать в одном?


@Echo Off
SetLocal EnableDelayedExpansion

rem Разбираем исходный файл построчно
For /F "usebackq delims=" %%L In ("test.txt") Do (
Set Text=%%L
rem Выделяем последний сегмент строки
For %%A In (%%L) Do (Set LastWord=%%A)
rem Костыль с for из-за невозможности замены с двумя !переменными!
For /F "delims=" %%S In ("!LastWord!") Do (
rem Убираем последний сегмент
Set Text=!Text:%%S=!
rem И откусываем последние два символа - точку с запятой и
rem разделитель-пробел
Set Text=!Text:~,-2!
)
rem Пишем строку в файл, имя которого берется из последнего сегмента её же
Echo !Text!>"C:\spisok\!LastWord!.txt"
)
Pause

На приведенном вами примере
текст текст текст 1111111111;
текст2 текст2 текст2 2222222222; »
работает. Как на реальных данных будет - зависит от них, я бы предпочел увидеть именно их. Из возможных узких мест:
* Длина строки не должна выходить за пределы максимальной длины переменной у командного интерпретатора windows
* Восклицательные знаки из текста будут убраны из-за EnableDelayedExpansion
* Имя конечного файла должно быть без пробелов, иначе один из циклов For воспримет его, как разделитель. Или, если пробелы нужны - заключено в двойные кавычки.

mxm199
04-07-2012, 11:30
ПРОСТО ШИКАРНО!!! Очень благодарен, огромное СПАСИБО )))
Не хочется наглеть ))) а возможно сделать, чтобы готовые разбитые файлы были в кодировке UTF8 без BOM ???

Anonymоus
04-07-2012, 11:34
mxm199, а исходные файлы в UTF-8 без BOM? Если да, то просто сохраните батник в такой же кодировке.
Если нет - можно с легкостью на лету сменять кодировку строки с помощью recode из пакета GNU coreutils

mxm199
04-07-2012, 11:57
исходный просто в АНСИ, это я понял, что зависит от исходника, при смене на УТФ исходника и готовые получаются в УТФ, ну это я так уже спросил )

....как тут плюс поставить...?

Anonymоus
04-07-2012, 12:12
Вот ещё на всякий случай, если вам придется работать с не-ANSI входным файлом:
Echo !Text!>"C:\spisok\!LastWord!.txt"
заменяется на
Echo !Text!|recode cp1251..utf8>"С:\spisok\!LastWord!.txt"
где cp1251 меняется на кодировку файла со входными данными. А саму утилиту recode можно взять отсюда (http://sourceforge.net/projects/unxutils/files/unxutils/current/UnxUtils.zip/download)
....как тут плюс поставить...? »
Снизу каждого поста есть ссылка "полезное сообщение".

mxm199
04-07-2012, 14:56
Всё просто супер )

рекоде должна соответственно вместе с батником лежать?

Anonymоus
04-07-2012, 14:58
Да, или рядом с батником, или в любой директории, прописанной в %Path%.




© OSzone.net 2001-2012