Показать полную графическую версию : Разделение текстового файла по условию
4eburashko
22-05-2024, 20:49
Здравствуйте!
Нужна помощь в решении.
Есть текстовый файл с каким-то количеством строк следующего вида:
01048120100172842124zyRCc5WLVjw9
0134556645534534543xAauUCEBEcvw9
0134556645534534543x1uLev5ZLbY29
01345566455345345437MoFpfffEtKi9
01048120100172842124LdiqxZuhFhT9
0104812010017284212p88fSYydydnZ9
9634554654765756767PgegCvfAy59S9
Нужно разделить его на части, критерием будет совпадение первых 19 символов строки. То есть нужно сравнивать первые 19 символов каждой строки и при совпадении сохранять в отдельный файл всю строку. Конкретно в данном случае должно быть 4 файла. Название файлам можно присваивать по порядку (1,2,3 и т.д.), но лучше чтоб название состояло как раз из этих 19 символов строки.
DJ Mogarych
23-05-2024, 00:37
Конкретно в данном случае должно быть 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"
}
4eburashko
23-05-2024, 08:21
Конкретно в данном случае должно быть 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. То есть основной файл разделяется на группы
DJ Mogarych
23-05-2024, 10:21
У первой строки есть совпадения с пятой и шестой, и я вам выше показал, как это выглядит с точки зрения компьютера.
Решение вашей задачи тоже приведено.
megaloman
23-05-2024, 14:49
@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
23-05-2024, 20:26
У первой строки есть совпадения с пятой и шестой, и я вам выше показал, как это выглядит с точки зрения компьютера.
Решение вашей задачи тоже приведено.
Да, это я был невнимателен. Спасибо, все работает!
@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
24-05-2024, 10:14
@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, но проблема была и до изменения.
megaloman
24-05-2024, 15:14
4eburashko, заархивируйте исходный файл, приложите к сообщению. У меня на >3000 строк отрабатывает нормально, каждый раз одинаково, сумма строк в разделенных файлах и исходном совпадают
4eburashko
27-05-2024, 14:04
4eburashko, заархивируйте исходный файл, приложите к сообщению. У меня на >3000 строк отрабатывает нормально, каждый раз одинаково, сумма строк в разделенных файлах и исходном совпадают
В коде добавил только расширение файла txt
megaloman
27-05-2024, 16:48
4eburashko, На выходе 11 файлов, сколько не запускай. Хоть 16 символов хоть 19. txt не при чем. Может как-то антивирус пытается файлы анализировать и при этом их занимает и поэтому доступ блокируется? Единственное, в исходном файле конец строки 0A а на выходе 0D 0A
DJ Mogarych
27-05-2024, 17:39
Статистика
Count Name Group
----- ---- -----
150 0104812010017284212 {01048120100172842124zyRCc5WLpjw91000592Nkas1WeM5pZy7jwMkgsM...
150 0104812010013637212 {01048120100136372126gHxQte8R1Ut910005921jTjpufAw7tu2pm3xB76...
150 0104812010013552212 {0104812010013552212u4qtsz6UFGNu91000592rggEJ4fLtkgA5XxBa4Ny...
300 0104812010011046212 {0104812010011046212EweWw4YewA6191000592AB5SxJW5rFtKHMEPEkiC...
300 0104812010010872212 {0104812010010872212KxMbTnptRApq91000592Er6pp7Mtfg9mwJRjz6HQ...
400 0104812010013439212 {01048120100134392128ZZPEYbgxSUM91000592ucYrZUUCbbfp1k87j8ca...
200 0104812010014788212 {0104812010014788212xi83469sfFCq91000592txpnRFpMYWhZWEfK2rXN...
300 0104812010001368212 {0104812010001368212p6K2rCbtxuER91000592S9HsTU5LYFEpNUepc6iN...
100 0104812010010131212 {0104812010010131212J6NuFHA2AmT691000592yxLaL7gAheYpaafwyBFp...
100 0104812010010155212 {0104812010010155212p1jrac9RFeSf91000592zppp9sKBU3q8UbpeJGtB...
100 0104812010010179212 {0104812010010179212LMNWBKYMHFZk910005926SFTb8kXaggLNWQjyzpp...
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.