Разбить тхт файл не только по строкам, но и по папкам
В замечательной теме раскрывается вопрос, как разбить большой тхт файл на много мелких по кол-ву строк
Моя задача чуть шире. Есть файл на 10 млн строк. Мне нужно получить 100 папок, в каждой по 100 файлов тхт, в каждом файле по 1000 строк из стартового файла. Названия папок 1,2,3,4,5,...,100 Названия файлов 1.txt, 2.txt, 3.txt, ..., 100.txt Кто-нибудь может помочь с этой непосильной для меня задачей? |
Цитата:
Лучше вооружитесь powershell-ом. |
А как powershellом это сделать? :)
|
Abricosio, размер файла:
Цитата:
|
Цитата:
Код:
$counter = 0; $linesPerFile=10000; Get-Content .\big.log | ForEach-Object { $counter++; Add-Content -Path "$(($counter/$linesPerFile).ToString('000000')).log" -Value $_ } После Get-Content указываете путь к файлу, в текущей директории создаются файлы по 10 тыс строк (количество задаётся переменной $linesPerFile) Цитата:
|
Цитата:
Код:
$fl = 'test.txt' Цитата:
|
Цитата:
|
Цитата:
Разве что, можно чуток оптимизировать, чтобы не дергать $tmp при каждой итерации: Код:
$fl = 'test.txt' |
Цитата:
|
|
Цитата:
Код:
gc text.txt Код:
gc text.txt -readcount 1000 |
Цитата:
|
Все отлично в примере на павершел, один только нюанс - пустая строчка в самом конце, но я ее регуляркой почикаю) Спасибо!
|
YuS_2, неверно
по умолчанию readcount равно единице, чтобы прочитать весь файл за раз нужно принудительно выставить нуль Вы смешали в одно "буфер чтения" и размер выходного файла. Всё это "значительно ускоряет процесс" пока файлы крохотные. А как только понадобится напилить файл на куски по несколько ГБ (например, чтобы на DVD записать) - так сразу скрипту и поплохеет. |
Busla, YuS_2, в документации сказано, что:
Цитата:
|
А нет, не получается, регуляркой эту строку не видно, удалить массово через notepad++ не получается. Возможно ли переделать скрипт, чтобы он не делал 1001-ю пустую строку?
Заранее большое спасибо! |
Abricosio, там нет «пустой строки»:
где Вы её нашли?! |
Странно, у меня во всех файлах последняя строка пустая, 1001я. Проверял в notepad++ и обычном тхт редакторе
|
Abricosio, это:
не «пустая строка». Пустая строка — вот: Если Вам категорически нужно, чтобы последняя строка не завершалась символами конца строки: — это другое дело. |
Цитата:
Код:
gc text.txt -raw Цитата:
Лично я говорил о том, что вредно помещать весь файл (при условии, что он достаточно большой) в память, чтобы производить с ним дальнейшие манипуляции. О размерах выходного файла заговорил ты, я ничего об этом не писал. Цитата:
1. Создай текстовый файл (UTF8, хотя это неважно), в 10000000 строк, с одним символом в каждой строке. Размер у него получится не сильно большим (чуть больше 28Мб), но достаточным для эксперимента. Возможно, конфигурация компьютера будет влиять на результат, но это можно "поправить" увеличением количества строк. :) 2. a) Код:
gc text.txt -read 5000000|set-content text-out.txt Код:
gc text.txt|set-content text-out.txt Мои результаты: a) TotalSeconds : 6,9191207 b) Неадекватное потребление физ.памяти до 3,5Гб и более процессом powershell, нагрузка процессора в 50% и более, плюс подвисания интерфейса windows. Терпения, чтобы дождаться окончания процесса (если это реально), у меня не хватило. В общем, плохеет не только скрипту и размер у файла не очень-то огромный... :) |
Iska, а есть какое-нибудь регулярное выражение для такого случая?
|
Abricosio, чем Вас текущее состояние не устраивает?
|
А не лучше будет в таких запущенных случаях(миллионы строк) отдать разбивку норм. проге на Цэ\Цэ++ - тот же Winrar , а потом собирать уже скриптом.
Ну т.е. отдать Winrar-у этот "миллионнострочный_файл" и нехай он его разбивает на фрагменты по 300kb(или скокатам получаеццо размер файла из 1000 строк). А потом эти фрагменты разложить по-папкам. :search: |
Цитата:
не лучше... вернее, чем лучше? хорошо, вот полный тест: Код:
$watch = [diagnostics.stopwatch]::startnew() Код:
Days : 0 |
Время: 19:04. |
Время: 19:04.
© OSzone.net 2001-