1

Тема: CMD/BAT: Удаление всех строк в массиве файлов после определенной.

Добрый день.
Имеется куча текстовых файлов в одной папке.Файлы проименованы последовательной  нумерацией: 1.txt,  2.txt ..... 1500.txt Примерно 1500 файлов.
Необходимо из каждого файла удалить все строки после сороковой.
Подскажите как это сделать?

2

Re: CMD/BAT: Удаление всех строк в массиве файлов после определенной.

Читайте отдельно каждый файл построчно до требуемой (сороковой) строки и одновременно пишите во временный. После этого копируйте временный файл в исходный.

( 2 * b ) || ! ( 2 * b )

3 (изменено: wisgest, 2012-12-19 15:06:57)

Re: CMD/BAT: Удаление всех строк в массиве файлов после определенной.

Rumata, да это достаточно очевидный подход.

Но ещё есть вопрос, в какой кодировке файлы. Если в UTF-16, то я не знаю, как читать файл построчно напрямую (CMD.EXE /U, по-моему, влияет только на вывод, но не на ввод); можно конечно преобразовать в однобайтную кодировку и обратно, но при этом возможны потери.

В случае UTF-8 затруднений быть не должно (хотя, кто его знает), т.к. в этом случае разделитель строк тот же, что и в однобайтовой кодировке и можно тупо прочесть строку из одного файла и сразу же записать в другой, не вникая, из каких кракозябров она состоит.

Впрочем, на основании этого пришла мысль насчёт обработки UTF-16 не через однобайтную кодировку, а через UTF-8:

chcp 65001>nul & cmd /c type "utf16_with_bom.txt">"ut8_without_bom.txt" & chcp 866>nul

rem Обработка ut8_without_bom.txt
rem . . .

::set /p x={Заменить эти скобки на BOM, если он нужен}>"utf16.txt" <nul
chcp 65001>nul & cmd /u /c type "ut8_without_bom.txt">>"utf16.txt" & chcp 866>nul

Но, возможно, более правильным решением было бы не перебрасывать данные с места на место, а лишь уменьшить размер файла до необходимого, но как это сделать (и не только через CMD), я по неопытности не знаю, так что самому интересно. (Или это всё-таки неправильно с точки зрения дефрагментации?)

4

Re: CMD/BAT: Удаление всех строк в массиве файлов после определенной.

wisgest пишет:

Но ещё есть вопрос, в какой кодировке файлы.

Думаю, пока не стоит засорять голову этим. Пусть для начала основной алгоритм реализует и проверит на нескольких файлах. Хотя вопрос кодировки - непростой. Особенно в винде.

wisgest пишет:

(CMD.EXE /U, по-моему, влияет только на вывод, но не на ввод).

Это под вопросом. Потому что сказано про вывод внутренней команды в поток или файл. Что будет с внешними командами - не ясно.

cmd /?
Starts a new instance of the Windows command interpreter
...
/A      Causes the output of internal commands to a pipe or file to be ANSI
/U      Causes the output of internal commands to a pipe or file to be
        Unicode
( 2 * b ) || ! ( 2 * b )

5 (изменено: wisgest, 2012-12-19 16:18:49)

Re: CMD/BAT: Удаление всех строк в массиве файлов после определенной.

Rumata пишет:

Что будет с внешними командами - не ясно.

На внешние, по-моему, не влияет, но ручаться не буду.  Так что при перенаправлении вывода CMD/U, вызывающего внешние команды, в файл,  весьма вероятночто файл будет в смешанной кодировке.

Впрочем, в данном случае я имел в виду искличительно внутренние команды: SET/P — для ввода и ECHO — для вывода.

А какие внешние команды тут могут быть полезны?