Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - Разделение текстового файла по условию

Ответить
Настройки темы
CMD/BAT - Разделение текстового файла по условию

Новый участник


Сообщения: 5
Благодарности: 0

Профиль | Отправить PM | Цитировать


Здравствуйте!
Нужна помощь в решении.
Есть текстовый файл с каким-то количеством строк следующего вида:
01048120100172842124zyRCc5WLVjw9
0134556645534534543xAauUCEBEcvw9
0134556645534534543x1uLev5ZLbY29
01345566455345345437MoFpfffEtKi9
01048120100172842124LdiqxZuhFhT9
0104812010017284212p88fSYydydnZ9
9634554654765756767PgegCvfAy59S9

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

Отправлено: 20:49, 22-05-2024

 

Аватара для DJ Mogarych

fascinating rhythm


Moderator


Сообщения: 6529
Благодарности: 1483

Профиль | Отправить PM | Цитировать


Цитата 4eburashko:
Конкретно в данном случае должно быть 4 файла »
Не 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"
}

-------
Powershell 7.x | Powershell 5.1 | ffmpeg (docs)

Это сообщение посчитали полезным следующие участники:

Отправлено: 00:37, 23-05-2024 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Новый участник


Сообщения: 5
Благодарности: 0

Профиль | Отправить PM | Цитировать


Цитата DJ Mogarych:
Цитата 4eburashko:
Конкретно в данном случае должно быть 4 файла »
Не 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. То есть основной файл разделяется на группы

Отправлено: 08:21, 23-05-2024 | #3


Аватара для DJ Mogarych

fascinating rhythm


Moderator


Сообщения: 6529
Благодарности: 1483

Профиль | Отправить PM | Цитировать


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

-------
Powershell 7.x | Powershell 5.1 | ffmpeg (docs)


Отправлено: 10:21, 23-05-2024 | #4


Ветеран


Contributor


Сообщения: 2715
Благодарности: 1688

Профиль | Отправить PM | Цитировать


Код: Выделить весь код
@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

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.

Это сообщение посчитали полезным следующие участники:

Отправлено: 14:49, 23-05-2024 | #5


Новый участник


Сообщения: 5
Благодарности: 0

Профиль | Отправить PM | Цитировать


Цитата 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, у себя подправил, спасибо!

Отправлено: 20:26, 23-05-2024 | #6


Новый участник


Сообщения: 5
Благодарности: 0

Профиль | Отправить PM | Цитировать


Изображения
Тип файла: jpg IMG-aebfb76861e70891402cb490d9ff61a8-V.jpg
(174.6 Kb, 6 просмотров)

Цитата 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, но проблема была и до изменения.

Отправлено: 10:14, 24-05-2024 | #7


Ветеран


Contributor


Сообщения: 2715
Благодарности: 1688

Профиль | Отправить PM | Цитировать


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

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 25-05-2024 в 08:26.


Отправлено: 15:14, 24-05-2024 | #8


Новый участник


Сообщения: 5
Благодарности: 0

Профиль | Отправить PM | Цитировать


Вложения
Тип файла: rar 1.rar
(105.9 Kb, 5 просмотров)

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

Отправлено: 14:04, 27-05-2024 | #9


Ветеран


Contributor


Сообщения: 2715
Благодарности: 1688

Профиль | Отправить PM | Цитировать


Вложения
Тип файла: rar 2.rar
(107.4 Kb, 1 просмотров)

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

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Отправлено: 16:48, 27-05-2024 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - Разделение текстового файла по условию

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
VBS/WSH/JS - Разделение текстового файла на части или по строкам. serg515 Скриптовые языки администрирования Windows 9 26-10-2020 14:41
Любой язык - Разбите текстового файла на отдельные файлы по определенному условию Artas28 Скриптовые языки администрирования Windows 12 05-04-2019 19:10
CMD/BAT - Разделение текстового файла на переменное количество частей и перемещение этих частей krokradio Скриптовые языки администрирования Windows 10 29-02-2016 13:16
CMD/BAT - Сборка текстового файла из содержимого другого текстового файла icomboy Скриптовые языки администрирования Windows 0 10-09-2013 15:17
CMD/BAT - Разделение текстового файла на части без разделения абзацев Re:Flex Скриптовые языки администрирования Windows 9 09-07-2013 04:35




 
Переход