phpbar.de logo

Mailinglisten-Archive

importscript (war: alternative zu joins ?)

importscript (war: alternative zu joins ?)

Michael Donning donning at informenta.de
Mit Feb 5 13:35:05 CET 2003


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