CMD/BAT - Разделение текстового файла по условию

Аватара пользователя
4eburashko

CMD/BAT - Разделение текстового файла по условию

Сообщение 4eburashko »

Здравствуйте!

Нужна помощь в решении.

Есть текстовый файл с каким-то количеством строк следующего вида:

01048120100172842124zyRCc5WLVjw9

0134556645534534543xAauUCEBEcvw9

0134556645534534543x1uLev5ZLbY29

01345566455345345437MoFpfffEtKi9

01048120100172842124LdiqxZuhFhT9

0104812010017284212p88fSYydydnZ9

9634554654765756767PgegCvfAy59S9



Нужно разделить его на части, критерием будет совпадение первых 19 символов строки. То есть нужно сравнивать первые 19 символов каждой строки и при совпадении сохранять в отдельный файл всю строку. Конкретно в данном случае должно быть 4 файла. Название файлам можно присваивать по порядку (1,2,3 и т.д.), но лучше чтоб название состояло как раз из этих 19 символов строки.
Аватара пользователя
DJ Mogarych

Re: CMD/BAT - Разделение текстового файла по условию

Сообщение DJ Mogarych »

Цитата 4eburashko:



Конкретно в данном случае должно быть 4 файла
CMD/BAT - Разделение текстового файла по условию




Не 4, а 3.





Код:

Код: Выделить всё

Count Name                      Group                                                            
----- ----                      -----                                                            
    3 0104812010017284212       {01048120100172842124zyRCc5WLVjw9, 01048120100172842124LdiqxZ...
    3 0134556645534534543       {0134556645534534543xAauUCEBEcvw9, 0134556645534534543x1uLev5...
    1 9634554654765756767       {9634554654765756767PgegCvfAy59S9}

Powershell



Код:

Код: Выделить всё

gc "C:\temp\in\file.txt" |group {$_.substring(0,19)} |% {
    $_.group > "C:\temp\out\$($_.name).txt"
}
Аватара пользователя
4eburashko

Re: CMD/BAT - Разделение текстового файла по условию

Сообщение 4eburashko »

Цитата DJ Mogarych:




Цитата 4eburashko:



Конкретно в данном случае должно быть 4 файла
CMD/BAT - Разделение текстового файла по условию




Не 4, а 3.





Код:

Код: Выделить всё

Count Name                      Group                                                            
----- ----                      -----                                                            
    3 0104812010017284212       {01048120100172842124zyRCc5WLVjw9, 01048120100172842124LdiqxZ...
    3 0134556645534534543       {0134556645534534543xAauUCEBEcvw9, 0134556645534534543x1uLev5...
    1 9634554654765756767       {9634554654765756767PgegCvfAy59S9}

Powershell



Код:

Код: Выделить всё

gc "C:\temp\in\file.txt" |group {$_.substring(0,19)} |% {
    $_.group > "C:\temp\out\$($_.name).txt"
}





Я не совсем правильно объяснил, если совпадений нет (как у первой строки), то она одна сохраняется в файл, поэтому файлов не 3, а 4. То есть основной файл разделяется на группы
Аватара пользователя
DJ Mogarych

Re: CMD/BAT - Разделение текстового файла по условию

Сообщение DJ Mogarych »

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

Решение вашей задачи тоже приведено.
Аватара пользователя
megaloman

Re: CMD/BAT - Разделение текстового файла по условию

Сообщение megaloman »

Код:

Код: Выделить всё

@Echo Off &Cls &>nul Chcp 1251
	Set "FileIn=Z:\Box_In\allstring.txt"
	Set "BoxOut=Z:\Box_Out"
	For /F "usebackq delims=" %%s In (`2^>nul More "%FileIn%"`) Do (
		Call :Out "%%s"
	)
Pause
Exit /B
:Out
	Set "Name=%~1"
	(>>"%BoxOut%\%Name:~0,19%" Echo %~1)
Exit /B
Аватара пользователя
4eburashko

Re: CMD/BAT - Разделение текстового файла по условию

Сообщение 4eburashko »

Цитата DJ Mogarych:



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

Решение вашей задачи тоже приведено.



Да, это я был невнимателен. Спасибо, все работает!




Цитата megaloman:





Код:

Код: Выделить всё

@Echo Off &Cls &>nul Chcp 1251
	Set "FileIn=Z:\Box_In\allstring.txt"
	Set "BoxOut=Z:\Box_Out"
	For /F "usebackq delims=" %%s In (`2^>nul More "%FileIn%"`) Do (
		Call :Out "%%s"
	)
Pause
Exit /B
:Out
	Set "Name=%~1"
	(>>"%BoxOut%\%Name:~0,19%" Echo %~1)
Exit /B





Ваш код тоже отлично работает, только не задаёт файлам расширение txt, у себя подправил, спасибо!
Аватара пользователя
4eburashko

Re: CMD/BAT - Разделение текстового файла по условию

Сообщение 4eburashko »

Цитата megaloman:





Код:

Код: Выделить всё

@Echo Off &Cls &>nul Chcp 1251
	Set "FileIn=Z:\Box_In\allstring.txt"
	Set "BoxOut=Z:\Box_Out"
	For /F "usebackq delims=" %%s In (`2^>nul More "%FileIn%"`) Do (
		Call :Out "%%s"
	)
Pause
Exit /B
:Out
	Set "Name=%~1"
	(>>"%BoxOut%\%Name:~0,19%" Echo %~1)
Exit /B





Почему то при большом исходном файле (около 2500 строк) картина немного другая. Пробовал несколько раз, создаётся 11-15 файлов, каждый раз по разному (если разделить вручную, то выходит около 40). При этом в консоль выводит информацию Процесс не может получить доступ к файлу. Количество проверяемых символов я изменил до 16, но проблема была и до изменения.
Вложения

[Расширение jpg было запрещено, вложение больше недоступно.]

Аватара пользователя
megaloman

Re: CMD/BAT - Разделение текстового файла по условию

Сообщение megaloman »

4eburashko, заархивируйте исходный файл, приложите к сообщению. У меня на >3000 строк отрабатывает нормально, каждый раз одинаково, сумма строк в разделенных файлах и исходном совпадают
Аватара пользователя
4eburashko

Re: CMD/BAT - Разделение текстового файла по условию

Сообщение 4eburashko »

Цитата megaloman:

4eburashko, заархивируйте исходный файл, приложите к сообщению. У меня на >3000 строк отрабатывает нормально, каждый раз одинаково, сумма строк в разделенных файлах и исходном совпадают

В коде добавил только расширение файла txt
Вложения
Вложение 1.rar больше недоступно
Вложения
1.rar
(105.86 КБ) 0 скачиваний
1.rar
(105.86 КБ) 0 скачиваний
Аватара пользователя
megaloman

Re: CMD/BAT - Разделение текстового файла по условию

Сообщение megaloman »

4eburashko, На выходе 11 файлов, сколько не запускай. Хоть 16 символов хоть 19. txt не при чем. Может как-то антивирус пытается файлы анализировать и при этом их занимает и поэтому доступ блокируется? Единственное, в исходном файле конец строки 0A а на выходе 0D 0A
Вложения
Вложение 2.rar больше недоступно
Вложения
2.rar
(107.43 КБ) 0 скачиваний
2.rar
(107.43 КБ) 0 скачиваний
Ответить

Вернуться в «Скриптовые языки администрирования Windows»