Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
|
если не нужно коррелировать данные между строчками, имее... 02.02.06 17:22 Число просмотров: 2279
Автор: NKritsky <Nickolay A. Kritsky> Статус: Elderman
|
> имеется csv файл 200 Мб - список продуктов для onlinte > магазина. > нужно произвести с ним некоторые действия: > - скопировать один столбец в другой > - извлеч список категорий > - добавить новый столбец с новыми категориями > > скрипт написан и работает с пробным файлом 315 Кб > > с 200 Мб работать не может. после 84 Мб обработка > прерывается...
если не нужно коррелировать данные между строчками, имее тсмысл обрабатывать файл построчно.
perl -n one_string_script.pl <bigCSVfile.txt
|
<programming>
|
[Perl] работа с большим текстовым файлом в perl 02.02.06 16:55
Автор: streptokok Статус: Незарегистрированный пользователь
|
имеется csv файл 200 Мб - список продуктов для onlinte магазина.
нужно произвести с ним некоторые действия:
- скопировать один столбец в другой
- извлеч список категорий
- добавить новый столбец с новыми категориями
скрипт написан и работает с пробным файлом 315 Кб
с 200 Мб работать не может. после 84 Мб обработка прерывается...
|
|
если не нужно коррелировать данные между строчками, имее... 02.02.06 17:22
Автор: NKritsky <Nickolay A. Kritsky> Статус: Elderman
|
> имеется csv файл 200 Мб - список продуктов для onlinte > магазина. > нужно произвести с ним некоторые действия: > - скопировать один столбец в другой > - извлеч список категорий > - добавить новый столбец с новыми категориями > > скрипт написан и работает с пробным файлом 315 Кб > > с 200 Мб работать не может. после 84 Мб обработка > прерывается...
если не нужно коррелировать данные между строчками, имее тсмысл обрабатывать файл построчно.
perl -n one_string_script.pl <bigCSVfile.txt
|
| |
помоему то что надо! 02.02.06 18:42
Автор: streptokok Статус: Незарегистрированный пользователь
|
> если не нужно коррелировать данные между строчками, имее > тсмысл обрабатывать файл построчно. > > perl -n one_string_script.pl <bigCSVfile.txt помоему то что надо!
подскажите, где можно найти примеры?
можете написать как это работает?
|
| | |
проще всего поправить ваш скрипт. если запостите - попробую... 02.02.06 19:18
Автор: NKritsky <Nickolay A. Kritsky> Статус: Elderman
|
> > если не нужно коррелировать данные между строчками, > имее > > тсмысл обрабатывать файл построчно. > > > > perl -n one_string_script.pl <bigCSVfile.txt > помоему то что надо! > подскажите, где можно найти примеры? > можете написать как это работает?
проще всего поправить ваш скрипт. если запостите - попробую показать как.
а в общем и целом, ключик -n делает вот что:
1. считывает одну строчку со stdin
2. запускает скрипт, помещая считаную строку в $_
3. goto 1 until end_of_file
|
| | | |
понятно! спасибо :) 03.02.06 15:22
Автор: streptokok Статус: Незарегистрированный пользователь
|
> проще всего поправить ваш скрипт. если запостите - попробую > показать как. > .... > а в общем и целом, ключик -n делает вот что: > > 1. считывает одну строчку со stdin > 2. запускает скрипт, помещая считаную строку в $_ > 3. goto 1 until end_of_file
понятно! спасибо :)
следующий вопрос - можно ли сохранять переменные между итерациями?
иначе придется каждый раз считывать hash из файла... долговато
my $src ="src.csv", $cat="categorie.csv", $dist ="dist.csv";
my $line, $flag, $feld, $new, $old, $name;
my %categorie, %relation;
# ---- read categorie ----
open (CAT, "<$cat") or die $!;
while(<CAT>){
chomp;
($new,$old,$name)=split(/\;/);
$relation{$old}=$new;
}
close (CAT);
# ---- write new categorie ----
open (SRC, "<$src") or die $!;
open (DIST, ">>$dist") or die $!;
$flag=0;
while(<SRC>){
chomp;
split(/\;/);
if($flag==0){
$feld="\"NewCategorieNumber\"";
$flag=1;
}
else {
if(!$relation{$_[25]}) {
$feld="\"0\"";
}
else {
$feld=$relation{$_[25]};
}
}
$line = join("\;",@_);
$line = $line."\;$feld\n";
print DIST $line;
}
close (DIST);
close (SRC);
|
| | | | |
Re 03.02.06 23:26
Автор: Heller <Heller> Статус: Elderman
|
> следующий вопрос - можно ли сохранять переменные между > итерациями? > иначе придется каждый раз считывать hash из файла... > долговато
Насколько я знаю, в случае использования ключа -n сохранять переменные между "циклами" нельзя. Варианты решения проблемы:
1. Сохраняй их в промежуточном файле. Должно не особенно сильно нагрузить систему.
2. Используй не -n, а нормальный цикл. По сути заключаешь программу в такую конструкцию:
open (FH, "yourfile");
while (<FH>) {
код
}
Должно полуиться все то же самое, что и с ключем -n. Правда, как я понял из изначального поста, такое не прошло. Не совсем понятно почему - у меня на ActiveStat'овском Perl работает все отлично. Да и вообще следующие записи, насколько я знаю, эквивалентны (не считая возможных конфликтов с именем дескриптора):
perl -n script.pl file.txt
perl -e "open(FH,'file.txt');while(<FH>){require 'script.pl'}"
Ошибка видимо не в величине файла, а в чем-то другом. С большими файлами (более 4 Гб) я имел проблемы только с использованием функций seek, tell и операторов вида -X. Построчное считывание всегда работало нормально.
ЗЫ. Сырца твоего не смотрел, уж извини :)
|
|
|