Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Массовое добавление одной строки из текстового списка в каждый текстовый файл в папке (http://forum.oszone.net/showthread.php?t=335949)

Ds444 31-07-2018 02:31 2824139

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

Iska 31-07-2018 03:21 2824141

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 2824142

Цитата:

Цитата Iska
2. Кодировка текстовых файлов какая? »

UTF-8 без BOM

Цитата:

Цитата Iska
Какие концы строк — CrLf, Lf или Cr? »

Понятия не имею. Но в Notepad++ я заменил все концы строк у всех файлов на \r

Цитата:

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

У меня ровно. Ну пусть просто остановится и напишет, что чего-то меньше.

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

Iska 31-07-2018 05:21 2824146

Цитата:

Цитата Ds444
Но в Notepad++ я заменил все концы строк у всех файлов на \r »

Зачем?!

Цитата:

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

Упакуйте пять реальных файлов в архив. Приложите туда же «другой текстовый файл», только не с 500, а с пятью строками текста. Посмотрим.

Ds444 31-07-2018 09:41 2824162

Вложений: 1
Цитата:

Цитата Iska
Цитата Ds444:
Но в Notepad++ я заменил все концы строк у всех файлов на \r »
Зачем?! »

Чтоб все одинаковые были.

Архив вот: http://forum.oszone.net/attachment.p...1&d=1533019223

Iska 31-07-2018 13:56 2824206

Цитата:

Цитата Ds444
Архив вот: »

Ну и? Строк в файле — 5, файлов — 4. А кто-то писал, что:
Цитата:

Цитата Ds444
У меня ровно. »

И для полного счастья — в List.txt кодировка ANSI/1251, в файлах — UTF-8/65001. Это уже задача не столько для пакетных файлов. Причём, в четвёртом файле нет ни одного конца строки — естественно, что добавляемая строка будет добавлена не второй строкой, а в конец первой и единственной строки, и там она так единственной и останется.

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

Ds444 31-07-2018 21:05 2824277

Цитата:

Цитата Iska
Ну и? Строк в файле — 5, файлов — 4. А кто-то писал, что: »

А потому что с примером я не заморачивался. Скидывал рандомно. А так их по 500. В принципе, ваш код работает. Помог. Если после другой программки вручную переходы строк не менять - он правильно ставит. Это в первый раз я просто руками лез. Сейчас смотрю - правильно делает. Причём если 2 раза код запускать и ставить сначала текст на латинице, а потом ещё по строке добавить на кириллице, всё равно работает и добавляет в нужной последовательности. Задача решена. А на кодировки он не особо смотрит. Причём Notepad++ показывает, что все кодировки в UTF-8. И козябр при работе кода нет.

Iska 31-07-2018 21:12 2824279

Ds444, если все файлы в кодировке UTF-8, то не страшно, работать будет.

viktor1981lob 20-03-2019 14:56 2864264

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

Iska 21-03-2019 03:08 2864402

Цитата:

Цитата viktor1981lob
с почти такой же задачей. »

С какой? Озвучьте её в деталях.

viktor1981lob 21-03-2019 10:53 2864424

Имеется папка(Source), которая содержит подпапки с файлами. каждая подпапка имеет свое уникальное имя. Количество папок меняется от раза к разу.
в кажой подпапке лежит 1(один) txt файл. содержимое и имя всех txt-файлов каталога одинаковое.
Имеется txt-файл(List), который содержит уникальные строки. Количество строк в txt-файле List всегда не меньше(>=) количества txt-файлов в каталоге Source.

Задача: в последнюю строку каждого txt-файла по всему дереву каталога добавить уникальную строку из списка list, то есть каждый файл должен получить уникальную строку.
если количество txt-файлов в каталоге меньше, чем строк в List. то, программа остановится после того как модифицирует последний файл.


надеюсь, такого описания достаточно?)

viktor1981lob 22-03-2019 15:12 2864607

Очень актуально догадываюсь что надо ввести небольшие изменения. буду благодарен за помощь.

mwz 22-03-2019 19:08 2864626

Цитата:

Цитата viktor1981lob
Очень актуально догадываюсь что надо ввести небольшие изменения »

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

viktor1981lob 22-03-2019 19:37 2864632

Вариант который я пробовал указан во втором сообщении темы, но я уже уже писал что он не справляется с моей задачей. к счастью это не моя курсовая, и я далек от разработки. но логика подсказывает что изменения требуются небольшие.

YuS_2 22-03-2019 20:32 2864638

Цитата:

Цитата viktor1981lob
Задача: в последнюю строку каждого 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 2864642

YuS_2, Спасибо! пока не пропускае запуск powershell. думаю разберусь и попробу.

viktor1981lob 22-03-2019 21:32 2864648

Не удается найти параметр соответствующий имени параметра 'файл'
Все написано как есть, папки лежат в source, в них txt. Не пойму куда смотреть?

Iska 22-03-2019 21:50 2864653

Цитата:

Цитата viktor1981lob
Все написано как есть, »

viktor1981lob, Вам надо задать две константы:
Цитата:

Цитата YuS_2
Код:

$fld = 'd:\source'
$list = 'd:\list.txt'

»


viktor1981lob 22-03-2019 21:57 2864655

Да, разумеется. у меня они в формате таком:
имена верные, лежат по адресам
PHP код:

$fld 'C:\str\source'
$list 'C:\str\list.txt' 


Iska 22-03-2019 22:07 2864659

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

viktor1981lob 22-03-2019 22:15 2864663

Код:

Get-ChildItem : Не удается найти параметр, соответствующий имени параметра "file".
строка:1 знак:39
+ $arr_file = dir $fld -filt *.txt -file <<<<  -rec
    + CategoryInfo          : InvalidArgument: (:) [Get-ChildItem], ParameterBindingException
    + FullyQualifiedErrorId : NamedParameterNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand


YuS_2 22-03-2019 22:17 2864664

Цитата:

Цитата viktor1981lob
Не удается найти параметр соответствующий имени параметра 'файл' »

семерка? рекомендую обновиться до powershell v 5.1
А пока, просто замените эту строку:
Цитата:

Цитата YuS_2
Код:

$arr_file = dir $fld -filt *.txt -file -rec
»

на такую:
Код:

$arr_file =  dir $fld -filter *.txt -rec|?{!$_.psiscontainer}

viktor1981lob 22-03-2019 22:27 2864667

Цитата:

Цитата YuS_2
семерка? »

она самая.
большое всем человеческое спасибо, заменил и все сработало как надо.

Iska 22-03-2019 22:32 2864668

viktor1981lob, тем не менее, лучше зараз обновить PowerShell до наиболее свежей версии — там много подобных «вкусных плюшек».


Время: 07:57.

Время: 07:57.
© OSzone.net 2001-