Strona 2 z 2
: 07 października 2010, 20:13
autor: turox
E, no nikt się nie boi, podałem po prostu alternatywny sposób w celach edukacyjnych. Perla sam używam bardzo często. Przy okazji - jednolinijkowiec w awk-u będzie wyglądał tak:
Kod: Zaznacz cały
awk 'BEGIN { FS = "," } ; { print $0 "," $3 }' plik.csv
: 08 października 2010, 09:27
autor: Skibbi
Panowie dziękuję za wszystkie porady! Jak już mówiłem nie mam zbyt dużego doświadczenia z obrabianiem danych a już zupełnie się boję składni perla. Ale jako że jestem ciekawy świata to się zapytam: czy perl szybciej obrobi 100k linii CSV w porównaniu z bashem? Być może mój skrypt w wersji 2.0 będzie już bardziej zoptymalizowany.
W końcu zagadałem do znajomego w miarę obcykanego w perlu. On mi dał podstawy, a ja się dalej zaczęłem bawić regexpem. Oto co spłodziłem po 2h uczenia się perla. Może komuś kiedyś się przyda:
Kod: Zaznacz cały
#!/usr/bin/perl
print "Usage: perl.pl input_filename [output_filename] [column_index] [additional_column_index]\n";
print "Working...\n";
$ifile = $ARGV[0];
$ofile = $ARGV[1];
$column = $ARGV[2];
$column2 = $ARGV[3];
open(FILE, "<", $ifile.".csv") or die $!;
if ($ofile ne "") {
open(OUTPUT, ">", $ofile.".csv") or die $!;
open(OUTPUT2, ">", $ofile."_rel.csv") or die $!;
open(HEADER1, "<", $ofile.".txt") or die $!;
open(HEADER2, "<", $ofile."_rel.txt") or die $!;
print OUTPUT2 <HEADER2>;
} else {
open(OUTPUT, ">", "_".$ifile.".csv") or die $!;
open(HEADER1, "<", $ifile.".txt") or die $!;
}
print OUTPUT <HEADER1>;
while (<FILE>) {
chomp;
#Replace , with #v#
$_ =~ s/,/#v#/g;
#Replace § with ,
$_ =~ s/§/,/g;
#Remove last column
$_ =~ s/,\w*$//g;
$line_to_save = $_;
if ($ofile ne "") {
@line = split(/,/, $_);
$var = @line[$column];
$var2 = @line[$column2];
$tail = $var;
$tail =~ s/^.+\_.+\_.+\_//g;
#print $tail."\n";
$head = $var;
$head =~ s/\d\_.{4}$//g;
#print $head."\n";
$line_to_save = $line_to_save.",".$head.$tail;
if ($column2 eq "") {
print OUTPUT2 $var.",".$head.$tail."\n";
} else {
print OUTPUT2 $var.",".$head.$tail.",".$var2."\n";
}
}
print OUTPUT $line_to_save."\n";
}
close(FILE);
close(HEADER1);
close(HEADER2);
close(OUTPUT);
close(OUTPUT2);
print "Done.\n";
Bashowy skrypt mielił 300MB csv około 40 min. Perl to samo zrobił w 2

Dziękuję wam za zainspirowanie mnie do nauki perla. Na pewno mi się ta wiedza przyda w przyszłości...
: 08 października 2010, 15:53
autor: turox
Że ile? 40 minut?
u mnie 5 sekund:
Plik wielkości 382M.
Chyba że o jakimś innym skrypcie mówisz.
: 08 października 2010, 16:59
autor: Skibbi
Mówię o moim pierwszym skrypcie, który mielił bashem

: 08 października 2010, 19:38
autor: turox
Tu akurat nie ma co porównywać, w każdym języku da się źle napisać program, który działa zbyt wolno...
