Показать полную графическую версию : [решено] Массовое добавление одной строки из текстового списка в каждый текстовый файл в папке
Есть папка с текстовыми файлами (500 шт). И есть другой текстовый файл с 500 строками текста (список). Нужен код для какого-нибудь батничка или подобие, чтоб строки из списка поочерёдно добавились следующей строкой a каждом из файлов папки: в 1й файл в папке добавилась 1я строка списка, во 2й файл - 2я строка списка. И т. д.
1. Ds444, есть одна проблема: не существует единого и однозначного порядка файлов, даже в Проводнике и в командной строке порядок/взаиморасположение файлов может отличаться. Что скажете на это?
2. Кодировка текстовых файлов какая? Какие концы строк — CrLf, Lf или Cr?
3. Кодировка и концы строк «другой текстовый файл с 500 строками текста (список)» какие?
4. Как быть, если файлов окажется меньше, чем строк в «другой текстовый файл»? Как быть, если наоборот — меньше будет строк, нежели файлов?
А так-то тупо — держите:
@echo off
setlocal enableextensions enabledelayedexpansion
<"List.txt" (
for /f "usebackq delims=" %%i in (
`2^>nul dir /b /a:-d /o:n "%~dp0Source\*.*"`
) do (
set /p sLine=
>>"%~dp0Source\%%i" echo !sLine!
)
)
endlocal
exit /b 0
В примере имя «другой текстовый файл с 500 строками текста (список)» — List.txt, папка с текстовыми файлами (500 шт) — подкаталог Source, расположенный в каталоге с пакетным файлом.
2. Кодировка текстовых файлов какая? »
UTF-8 без BOM
Какие концы строк — CrLf, Lf или Cr? »
Понятия не имею. Но в Notepad++ я заменил все концы строк у всех файлов на \r
4. Как быть, если файлов окажется меньше, чем строк в «другой текстовый файл»? Как быть, если наоборот — меньше будет строк, нежели файлов? »
У меня ровно. Ну пусть просто остановится и напишет, что чего-то меньше.
Потестил батничек. Строку из файла он добавляет в конец первой строки, которая уже есть в файле. Но вторую всё же создаёт. Она пустая остаётся.
Но в Notepad++ я заменил все концы строк у всех файлов на \r »
Зачем?!
Потестил батничек. Строку из файла он добавляет в конец первой строки, которая уже есть в файле. Но вторую всё же создаёт. Она пустая остаётся. »
Упакуйте пять реальных файлов в архив. Приложите туда же «другой текстовый файл», только не с 500, а с пятью строками текста. Посмотрим.
Цитата Ds444:
Но в Notepad++ я заменил все концы строк у всех файлов на \r »
Зачем?! »
Чтоб все одинаковые были.
Архив вот: http://forum.oszone.net/attachment.php?attachmentid=153511&stc=1&d=1533019223
Архив вот: »
Ну и? Строк в файле — 5, файлов — 4. А кто-то писал, что:
У меня ровно. »
И для полного счастья — в List.txt кодировка ANSI/1251, в файлах — UTF-8/65001. Это уже задача не столько для пакетных файлов. Причём, в четвёртом файле нет ни одного конца строки — естественно, что добавляемая строка будет добавлена не второй строкой, а в конец первой и единственной строки, и там она так единственной и останется.
Вам есть, что сказать по изложенному? Можете дать какие-то пояснения?
Ну и? Строк в файле — 5, файлов — 4. А кто-то писал, что: »
А потому что с примером я не заморачивался. Скидывал рандомно. А так их по 500. В принципе, ваш код работает. Помог. Если после другой программки вручную переходы строк не менять - он правильно ставит. Это в первый раз я просто руками лез. Сейчас смотрю - правильно делает. Причём если 2 раза код запускать и ставить сначала текст на латинице, а потом ещё по строке добавить на кириллице, всё равно работает и добавляет в нужной последовательности. Задача решена. А на кодировки он не особо смотрит. Причём Notepad++ показывает, что все кодировки в UTF-8. И козябр при работе кода нет.
Ds444, если все файлы в кодировке UTF-8, то не страшно, работать будет.
viktor1981lob
20-03-2019, 14:56
Здравствуйте! Спасибо за текущее решение.
Столкнулся с почти такой же задачей. Разница тольок в том, что каждый .txt файл лежит в своем подкаталоге каталога Sourсe.(то есть в Source я закидываю не 500 файлов, а 500 папок с файлами) И до них программа не добирается.
Какой код поможет решить такую задачу? Спасибо!
с почти такой же задачей. »
С какой? Озвучьте её в деталях.
viktor1981lob
21-03-2019, 10:53
Имеется папка(Source), которая содержит подпапки с файлами. каждая подпапка имеет свое уникальное имя. Количество папок меняется от раза к разу.
в кажой подпапке лежит 1(один) txt файл. содержимое и имя всех txt-файлов каталога одинаковое.
Имеется txt-файл(List), который содержит уникальные строки. Количество строк в txt-файле List всегда не меньше(>=) количества txt-файлов в каталоге Source.
Задача: в последнюю строку каждого txt-файла по всему дереву каталога добавить уникальную строку из списка list, то есть каждый файл должен получить уникальную строку.
если количество txt-файлов в каталоге меньше, чем строк в List. то, программа остановится после того как модифицирует последний файл.
надеюсь, такого описания достаточно?)
viktor1981lob
22-03-2019, 15:12
Очень актуально догадываюсь что надо ввести небольшие изменения. буду благодарен за помощь.
Очень актуально догадываюсь что надо ввести небольшие изменения »
Так приведите свой вариант, в котором вы сомневаетесь. Поскольку решение курсовых работ в задачу форума не входит.
viktor1981lob
22-03-2019, 19:37
Вариант который я пробовал указан во втором сообщении темы, но я уже уже писал что он не справляется с моей задачей. к счастью это не моя курсовая, и я далек от разработки. но логика подсказывает что изменения требуются небольшие.
Задача: в последнюю строку каждого txt-файла по всему дереву каталога добавить уникальную строку из списка list, то есть каждый файл должен получить уникальную строку.
если количество txt-файлов в каталоге меньше, чем строк в List. то, программа остановится после того как модифицирует последний файл. »
powershell
script.ps1
$fld = 'd:\source'
$list = 'd:\list.txt'
$arr_file = dir $fld -filt *.txt -file -rec
$arr_list = gc $list -enc utf8
for ($i=0;$i -lt $arr_file.count;$i++){
$arr_list[$i]|ac $arr_file[$i].fullname -enc utf8
}
viktor1981lob
22-03-2019, 21:04
YuS_2, Спасибо! пока не пропускае запуск powershell. думаю разберусь и попробу.
viktor1981lob
22-03-2019, 21:32
Не удается найти параметр соответствующий имени параметра 'файл'
Все написано как есть, папки лежат в source, в них txt. Не пойму куда смотреть?
Все написано как есть, »
viktor1981lob, Вам надо задать две константы:
$fld = 'd:\source'
$list = 'd:\list.txt' »
viktor1981lob
22-03-2019, 21:57
Да, разумеется. у меня они в формате таком:
имена верные, лежат по адресам
$fld = 'C:\str\source'
$list = 'C:\str\list.txt'
viktor1981lob, скопируйте сюда результирующее содержимое окна консоли PowerShell, обрамив его тэгом code (а не тэгом php).
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.