Mailinglisten-Archive |
Hallo Nikolas,
Als Inspiration hab ich hier noch ein Script, was ich für ähnliche Zwecke
einsetze (Perl).
Ohne Gewähr und evtl. durch Zeilenumbruch verunstaltet:
---------------mysql_imp_upd.pl---------------
#!/usr/bin/perl
#
# import einer textdatei, update wenn vorhanden, insert wenn nicht
use DBI;
use Text::ParseWords;
#################### log_line ####################
# texte in eine trace-datei ausgeben
sub log_line {
my ($logline) = @_;
open(LOG_FILE,'>>trace.log');
print LOG_FILE localtime(time())." $logline\n";
close(LOG_FILE);
}
### los gehts
#definitionen (auch per parameter denkbar)
$tname="benutzer"; #tabelle
$fname="import.txt"; #importdatei, csv, quoted, sep=,
$icols="KdNr,Firstname,Name,Name2";
$pkeyidx=0; #spaltenindex des primkeys (hier nur eine spalte)
$database = "database";
log_line("start: mysql_imp_upd");
$dsn = "DBI:mysql:$database";
$dbh = DBI->connect ($dsn,'user','password');
if ( !defined $dbh) {
log_line("Connect error: $database");
die print "Konnte nicht zu Datenbank $database verbinden!\n";
}
@icollist=split(/,/,$icols);
$pkeyname=$icollist[$pkeyidx];
$setlist="";
$ilist="";
foreach $cname (@icollist) {
$setlist.=(($setlist)?", ":"").$cname."=?";
$ilist.=(($ilist)?",":"")."?";
}
$usql="UPDATE $tname SET ".$setlist." WHERE $pkeyname=?";
$isql="INSERT IGNORE INTO $tname ($icols) VALUES ($ilist)";
log_line($usql);
log_line($isql);
$usth=$dbh->prepare($usql);
$isth=$dbh->prepare($isql);
#1 x alle updaten (versuchen)
$cntupd=0;
$cntrow=0;
$cntins=0;
$cntnochange=0;
@ilist=();
print "lese datei:\n";
if (open(IMP_FILE,"<$fname")) {
while (<IMP_FILE>) {
$line=$_;
@cols=quotewords(",",0,$line);
while (@cols<@icollist) {
push(@cols,undef);
#Versuch, die erforderliche Anzahl Spalten anzufuegen, wenn import-datei
fehlerhaft
}
push(@cols,$cols[$pkeyidx]); #pkey fuer where-stmt hinten anhaengen
$rc=$usth->execute(@cols);
if ($rc eq "1") { #davon ausgehend, dass der primaerschluessel auch
einer ist
$cntupd++;
} else {
push(@ilist,$line);
#ansonsten fuer insert vormerken hier landen auch
#unveraenderte Zeilen) (beachte speicherbedarf bei sehr grossen dateien)
}
$cntrow++;
if (!($cntrow % 10000)) {
print "Zeile $cntrow\n";
}
}
close(IMP_FILE);
}
print " $cntupd Updates, $cntnochange existierend, aber unveraendert\n";
foreach $line (@ilist) {
@cols=quotewords(",",0,$line);
while (@cols<@icollist) {
push(@cols,undef);
#Versuch, die erforderliche Anzahl Spalten anzufuegen, wenn import-datei
fehlerhaft
}
$rc=$isth->execute(@cols);
if ($rc eq "1") { #davon ausgehend, dass der primaerschluessel auch
einer ist
$cntins++;
} else {
$cntnochange++;
}
if (!($cntins % 10000)) {
print "Inserts $cntins\n";
}
}
print "Fertig: $cntupd Updates, $cntnochange unveraendert, $cntins
Inserts\n";
log_line("stop: mysql_imp_upd update: $cntupd, insert: $cntins, error:
$cnterr");
$usth->finish;
$isth->finish;
$dbh->disconnect;
---------------mysql_imp_upd.pl---------------
Grüße,
Michael Donning
--
Infos zur Mailingliste, zur Teilnahme und zum An- und Abmelden unter
-->> http://www.4t2.com/mysql
php::bar PHP Wiki - Listenarchive