[+] doklejanie tekstu do ko

Potrzebujesz pomocy z C, C++, perl, python, itp.
Awatar użytkownika
turox
Posty: 49
Rejestracja: 19 września 2010, 15:40
Lokalizacja: Tychy

Post 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
Skibbi
Posty: 33
Rejestracja: 20 lipca 2007, 19:01

Post 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 :D
Dziękuję wam za zainspirowanie mnie do nauki perla. Na pewno mi się ta wiedza przyda w przyszłości...
Awatar użytkownika
turox
Posty: 49
Rejestracja: 19 września 2010, 15:40
Lokalizacja: Tychy

Post autor: turox »

Że ile? 40 minut?
u mnie 5 sekund:

Kod: Zaznacz cały

real    0m5.640s
user    0m5.080s
sys     0m0.404s
Plik wielkości 382M.

Chyba że o jakimś innym skrypcie mówisz.
Skibbi
Posty: 33
Rejestracja: 20 lipca 2007, 19:01

Post autor: Skibbi »

Mówię o moim pierwszym skrypcie, który mielił bashem :)
Awatar użytkownika
turox
Posty: 49
Rejestracja: 19 września 2010, 15:40
Lokalizacja: Tychy

Post 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... :)
ODPOWIEDZ