Компьютерный форум 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=355304)

4eburashko 22-05-2024 20:49 3027504

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

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

DJ Mogarych 23-05-2024 00:37 3027506

Цитата:

Цитата 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"
}


4eburashko 23-05-2024 08:21 3027510

Цитата:

Цитата DJ Mogarych (Сообщение 3027506)
Цитата:

Цитата 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. То есть основной файл разделяется на группы

DJ Mogarych 23-05-2024 10:21 3027514

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

megaloman 23-05-2024 14:49 3027519

Код:

@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 3027524

Цитата:

Цитата DJ Mogarych (Сообщение 3027514)
У первой строки есть совпадения с пятой и шестой, и я вам выше показал, как это выглядит с точки зрения компьютера.
Решение вашей задачи тоже приведено.

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

Цитата:

Цитата megaloman (Сообщение 3027519)
Код:

@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 3027535

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

Цитата megaloman (Сообщение 3027519)
Код:

@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 3027545

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

4eburashko 27-05-2024 14:04 3027609

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

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

В коде добавил только расширение файла txt

megaloman 27-05-2024 16:48 3027615

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

DJ Mogarych 27-05-2024 17:39 3027616

Статистика
Код:

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...



Время: 15:06.

Время: 15:06.
© OSzone.net 2001-