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