[LUGOS] Obdelovanje dn v perlu

matija+lugos at serverflow.com matija+lugos at serverflow.com
Thu Jul 6 10:44:38 CEST 2006


matjaz.demsar at lj-mlek.si wrote:
>
> Pozdravljeni!
>
> Pišem skripto, ki bi prebrala vrednosti iz cvs datoteke in jih vpisala v Mysql bazo. Skripta bere vrstico za vrstico in podatke piše v bazo. Zgleda nekako takole:
>
> #!/usr/bin/perl -w
> use DBI;
>
> $dbh = DBI->connect('DBI:mysql:lmprint;host=myhost', 'myuser', 'mypass', { RaiseError =>1 });
>
> open(F1,"/tmp/test.csv");
> while($line = <F1>) {
> if ($line =~ /^([\w\-\_+])\.\S+\,(\d+)\,(\d+)\,(\d+)\.\d+/) {
> $insert = "INSERT INTO report_current_month(printer, jobs, pages, cost) VALUES('$1','$2','$3','$4')";
> $sth = $dbh->prepare($insert);
> $sth->execute;
> }
> }
> close(F1);
Iz CVS datoteke (code versioning system) ali iz CSV (comma separated values) ?
Ce to drugo, bi lahko uporabil Text::CSV_XS:

#!/usr/bin/perl -w
use DBI;
use Text::CSV_XS;

$dbh = DBI->connect('DBI:mysql:lmprint;host=myhost', 'myuser', 'mypass', { RaiseError =>1 });
# Pri open se splaca povedati, zakaj ne dela
open(F1,"/tmp/test.csv") || die "Could not open /tmp/test.csv: $!\n";
# Hitreje je, ce prepare klices samo enkrat, izven zanke
# Uporaba placeholderjev (?) pa ti omogoci, da ti ni treba skrbeti za pravilno quotanje parametrov.
# ker se tako izognes raznim sql injection napadom, se nanje splaca navaditi.
$insert = "INSERT INTO report_current_month(printer, jobs, pages, cost) VALUES(?,?,?,?)";
$sth=$dbh->prepare($insert);
while (defined($columns = $csv->getline(\*F1))) {
$sth->execute($columns->[0],$columns->[1],$columns->[2],$columns->[3]);
}

(Koda ni bila testirana, ampak tipkana naravnost v mail - za manjse napake se
opravicujem). 



More information about the lugos-list mailing list