Войти

Показать полную графическую версию : [решено] Массовое добавление одной строки из текстового списка в каждый текстовый файл в папке


Страниц : [1] 2

Ds444
31-07-2018, 02:31
Есть папка с текстовыми файлами (500 шт). И есть другой текстовый файл с 500 строками текста (список). Нужен код для какого-нибудь батничка или подобие, чтоб строки из списка поочерёдно добавились следующей строкой a каждом из файлов папки: в 1й файл в папке добавилась 1я строка списка, во 2й файл - 2я строка списка. И т. д.

Iska
31-07-2018, 03:21
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, расположенный в каталоге с пакетным файлом.

Ds444
31-07-2018, 04:23
2. Кодировка текстовых файлов какая? »
UTF-8 без BOM

Какие концы строк — CrLf, Lf или Cr? »
Понятия не имею. Но в Notepad++ я заменил все концы строк у всех файлов на \r

4. Как быть, если файлов окажется меньше, чем строк в «другой текстовый файл»? Как быть, если наоборот — меньше будет строк, нежели файлов? »
У меня ровно. Ну пусть просто остановится и напишет, что чего-то меньше.

Потестил батничек. Строку из файла он добавляет в конец первой строки, которая уже есть в файле. Но вторую всё же создаёт. Она пустая остаётся.

Iska
31-07-2018, 05:21
Но в Notepad++ я заменил все концы строк у всех файлов на \r »
Зачем?!

Потестил батничек. Строку из файла он добавляет в конец первой строки, которая уже есть в файле. Но вторую всё же создаёт. Она пустая остаётся. »
Упакуйте пять реальных файлов в архив. Приложите туда же «другой текстовый файл», только не с 500, а с пятью строками текста. Посмотрим.

Ds444
31-07-2018, 09:41
Цитата Ds444:
Но в Notepad++ я заменил все концы строк у всех файлов на \r »
Зачем?! »
Чтоб все одинаковые были.

Архив вот: http://forum.oszone.net/attachment.php?attachmentid=153511&stc=1&d=1533019223

Iska
31-07-2018, 13:56
Архив вот: »
Ну и? Строк в файле — 5, файлов — 4. А кто-то писал, что:
У меня ровно. »
И для полного счастья — в List.txt кодировка ANSI/1251, в файлах — UTF-8/65001. Это уже задача не столько для пакетных файлов. Причём, в четвёртом файле нет ни одного конца строки — естественно, что добавляемая строка будет добавлена не второй строкой, а в конец первой и единственной строки, и там она так единственной и останется.

Вам есть, что сказать по изложенному? Можете дать какие-то пояснения?

Ds444
31-07-2018, 21:05
Ну и? Строк в файле — 5, файлов — 4. А кто-то писал, что: »
А потому что с примером я не заморачивался. Скидывал рандомно. А так их по 500. В принципе, ваш код работает. Помог. Если после другой программки вручную переходы строк не менять - он правильно ставит. Это в первый раз я просто руками лез. Сейчас смотрю - правильно делает. Причём если 2 раза код запускать и ставить сначала текст на латинице, а потом ещё по строке добавить на кириллице, всё равно работает и добавляет в нужной последовательности. Задача решена. А на кодировки он не особо смотрит. Причём Notepad++ показывает, что все кодировки в UTF-8. И козябр при работе кода нет.

Iska
31-07-2018, 21:12
Ds444, если все файлы в кодировке UTF-8, то не страшно, работать будет.

viktor1981lob
20-03-2019, 14:56
Здравствуйте! Спасибо за текущее решение.
Столкнулся с почти такой же задачей. Разница тольок в том, что каждый .txt файл лежит в своем подкаталоге каталога Sourсe.(то есть в Source я закидываю не 500 файлов, а 500 папок с файлами) И до них программа не добирается.
Какой код поможет решить такую задачу? Спасибо!

Iska
21-03-2019, 03:08
с почти такой же задачей. »
С какой? Озвучьте её в деталях.

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
Очень актуально догадываюсь что надо ввести небольшие изменения. буду благодарен за помощь.

mwz
22-03-2019, 19:08
Очень актуально догадываюсь что надо ввести небольшие изменения »

Так приведите свой вариант, в котором вы сомневаетесь. Поскольку решение курсовых работ в задачу форума не входит.

viktor1981lob
22-03-2019, 19:37
Вариант который я пробовал указан во втором сообщении темы, но я уже уже писал что он не справляется с моей задачей. к счастью это не моя курсовая, и я далек от разработки. но логика подсказывает что изменения требуются небольшие.

YuS_2
22-03-2019, 20:32
Задача: в последнюю строку каждого 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. Не пойму куда смотреть?

Iska
22-03-2019, 21:50
Все написано как есть, »
viktor1981lob, Вам надо задать две константы:
$fld = 'd:\source'
$list = 'd:\list.txt' »

viktor1981lob
22-03-2019, 21:57
Да, разумеется. у меня они в формате таком:
имена верные, лежат по адресам
$fld = 'C:\str\source'
$list = 'C:\str\list.txt'

Iska
22-03-2019, 22:07
viktor1981lob, скопируйте сюда результирующее содержимое окна консоли PowerShell, обрамив его тэгом code (а не тэгом php).




© OSzone.net 2001-2012