> если не нужно коррелировать данные между строчками, имее > тсмысл обрабатывать файл построчно. > > perl -n one_string_script.pl <bigCSVfile.txt помоему то что надо!
подскажите, где можно найти примеры?
можете написать как это работает?
имеется 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
> проще всего поправить ваш скрипт. если запостите - попробую > показать как. > .... > а в общем и целом, ключик -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);
> следующий вопрос - можно ли сохранять переменные между > итерациями? > иначе придется каждый раз считывать 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. Построчное считывание всегда работало нормально.