Schrift
[thread]3755[/thread]

Einträge in SQL Datenbank: Testdatei in SQL DB einlesen und aktuali



<< >> 6 Einträge, 1 Seite
Gast Gast
 2006-12-20 13:03
#35014 #35014
Hallo,
bin der absolute Perl-Einsteiger.
Ich versuche Dateien aus einer Textdatei in eine SQL-Datenbank über ODBC einzulesen. Das klappt jetzt auch schon und die Datenbank wird gefüllt.

Mein Problem ist jetzt, wie kann ich die Daten aktualisieren, wenn sich täglich die Textdateiinhalte teilweise ändern/erneuern.

Ich müsste irgendwie den Inhalt der Datenbank mit dem Inhalt der Textdatei vergleichen und wenn die Einträge neuer sind, dann in der SQL-Datenbank überschreiben.

Kann mir da jemand helfen?

Anbei mal das Skript:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#!perl
#Datenimport Etikett von PPS ----> Etikett SQL DB
#use strict;
use Win32;
use Win32::ODBC;

my $db =new Win32::ODBC("dsn=Etikett") or die "Fehler1: $!\n";
print qq|eingelesen1\n|;

my $file = qq|t:/wip-etti.prn|;

open LESEN, "$file" or die "Fehler2: $!\n";
@lines = <LESEN>;
close(LESEN);
print qq|eingelesen\n|;
foreach (@lines) {
print qq|$_\n|;
chomp($_;
my $Auftrag = substr($_,119,16);
my $Artikel = substr($_,23,10);
my $Typ = substr($_,41,24);
my $Stueck = substr($_,66,10);
# (my $Auftrag,my $Artikel,my $Typ,my $Stueck) = split(/\|/,$_;
print qq|$Auftrag,\t$Artikel,\t$Typ,\t$Stueck\n|;
$statement = "INSERT INTO Etikett (Auftrag,Artikel,Typ,Stueck) VALUES('$Auftrag', '$Artikel', '$Typ', '$Stueck'";
$db->Sql("$statement");

}
$db->Close();
\n\n

<!--EDIT|renee|1166630272-->
nepos
 2006-12-20 13:21
#35015 #35015
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Also, erstens wuerde ich dir - wie so oft - zum Einsatz von Platzhaltern in den SQL-Befehlen raten. Damit musst du dich selbst nicht mehr um das korrekte Quoting und Escapen von speziellen Zeichen kuemmern.

Zum eigentlichen Problem: Mach dir einen SELECT, mit dem du pruefst, ob die Daten, die du einlesen willst nicht schon in der DB drin sind:
Code (perl): (dl )
1
2
3
4
unless ($dbh->selectrow_array(qq{SELECT * FROM Etikett WHERE Auftrag=? AND Atrikel=? AND Typ=? AND Stueck=?}, undef, $Auftrag, $Artikel, $Typ, $Stueck)) {
$dbh->do(qq{INSERT INTO Etikett (Auftrag,Artikel,Typ,Stueck) VALUES(?,?,?,?)},undef, $Auftrag, $Artikel, $Typ, $Stueck)
  or die "Fehler beim Einfuegen: $DBI::errstr\n";
}

Hier hast du auch gleich mal zwei Beispiele, wie du mit Platzhaltern arbeitest.
Den Code musst du halt eventuell noch an deine Gegebenheiten anpassen, aber ich denke, das Prinzip ist nun klar oder?

PS: Sehe grade, du nutzt Win32::ODBC, von daher musst du halt den SQL-Kram entsprechend anpassen und wie das da mit Platzhaltern ist, weis ich nicht. Sollte damit aber denke ich auch gehen.
Gast Gast
 2006-12-20 17:41
#35016 #35016
@nepos
vorerst vielen DAnk für die schnelle Antwort. So ganz habe ich das nicht verstanden mit den Platzhaltern. Wie kann ich auf die Inhalte der Datenbank zugreifen um sie zu vergleichen? Ob ich über select die spalten auslese in ein Array und dann mit den Array (Inhalt der Textdateidaten) der eingelesenen Daten vergleichen?...Bin ein bissl ratlos...
habe bei Perl irgendwie Probleme mit der richtigen Syntax...
renee
 2006-12-20 17:56
#35017 #35017
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Die Platzhalter sorgen dafür, dass Sonderzeichen gequotet werden. Sonst sind rein theoretisch Wikipedia:SQL Injections möglich.

Nehmen wir zum Beispiel mal die folgende Abfrage (nur SQL):[sql]SELECT * FROM user WHERE username = '$username' AND password = '$password'[/sql]

Wenn jetzt jemand so etwas als $username und $password übergeben würde:
Code: (dl )
' OR '1' = '1
, dann würde da zusammengesetzt folgendes rauskommen:[sql]SELECT * FROM user WHERE username = '' OR '1' = '1' AND password = '' OR '1' = '1'[/sql]...

Mit den Platzhaltern werden die ' automatisch gequotet, so dass folgendes rauskommt:[sql]SELECT * FROM user WHERE username = '\' OR \'1\' = \'1' AND password = '\' OR \'1\' = \'1'[/sql]...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
renee
 2006-12-20 18:00
#35018 #35018
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Was heißt "neuer"?

Kannst Du mal posten inwiefern sich die Textdatei ändern kann und wie dann auf gewisse Datensätze reagiert werden soll.

Ich würde Dir auch dazu raten, CPAN:DBI mit CPAN:DBD::ODBC statt Win32::ODBC zu verwenden...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
nepos
 2006-12-20 20:43
#35019 #35019
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
@renee: Ich denke, ihm geht es einfach darum, Duplikate zu vermeiden.

@perl-dummy: Naja, wie du auf die Inhalte zugreifen kannst, das geht doch genau so, wie du auch reinschreibst ;) Nur dass du halt über den SELECT schaust, ob ein Datensatz mit den Werten, die du einfügen willst schon drin ist. Wenn das der Fall ist, sparst dir das Einfügen und weiter mit dem nächsten.
<< >> 6 Einträge, 1 Seite



View all threads created 2006-12-20 13:03.