информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Атака на InternetСтрашный баг в WindowsВсе любят мед
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Бэкдор в xz/liblzma, предназначенный... 
 Три миллиона электронных замков... 
 Doom на газонокосилках 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
[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. Построчное считывание всегда работало нормально.

ЗЫ. Сырца твоего не смотрел, уж извини :)
1




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2024 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach