Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]11559[/thread]

Problem beim Importieren in eine MySQL DB



<< |< 1 2 >| >> 11 Einträge, 2 Seiten
schiba82
 2008-04-02 17:56
#107750 #107750
User since
2008-04-02
6 Artikel
BenutzerIn
[default_avatar]
Hallo zusammen,

ich bin neu hier und habe sofort meine erste Frage ;)

Ich habe folgendes Problem. Ich habe einen CSV Export mit Ticket Daten den ich gerne voll automatisch in eine MySQL DB importieren möchte.
Habe mir dazu ein Perl Script geschrieben, dass nichts anderes tut, als die "CSV Datei zu öffnen, die Daten in ein Array zu schreiben,
jeweils nach einem ";" den String splittet und dann in die DB schreibt. Fuktioniert auch alles wunderbar, bis auf bei
folgenden Strings nicht:

Im Feld TicketTitle steht der String:
"Passwort zurücksetzen auf "123456""
Im Feld Queue:
"On Site Team "Standort""

Die DB Felder haben folgende Datentypen:
TicketTitle VARCHAR(255)
Queue VARCHAR(50)

Sobald also im Text etwas in " " steht bekomme ich folgenden Fehler. Die ersten Anführungszeichen sind kein Problem nur wenn Sie "doppelt" in einem String vorkommen bekomme ich den Fehler:

DBD::mysql::st execute failed: You have an error in your SQL syntax;

Wie kann ich das abfangen oder den Fehler beheben?
Vielen Dank für eure Hilfe!
GwenDragon
 2008-04-02 18:04
#107751 #107751
User since
2005-01-17
14745 Artikel
Admin1
[Homepage]
user image
Ein bisschen wenig Info.

Wie holst du dir die CSV-Daten?
Wie schreibst du die Daten in die MySQL-Datenbank?
Wie sieht dein Skript aus?
pktm
 2008-04-02 18:06
#107752 #107752
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Ja, zeig mal etwas Code.
Hast du die Eingaben gequoted?
Wie baust du deine Statements? Von Hand? Mit einem Modul? Mit oder ohne Platzhalter?

Grüße, pktm
http://www.intergastro-service.de (mein erstes CMS :) )
pq
 2008-04-02 18:27
#107753 #107753
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
csv einlesen mit Text::CSV, Text::CSV_XS oder DBD::CSV, und in mysql rein mit DBD::mysql und platzhaltern.
dann sollte alles klappen.
zu platzhaltern: http://perloo.de/DBI/11.html
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
schiba82
 2008-04-02 18:31
#107755 #107755
User since
2008-04-02
6 Artikel
BenutzerIn
[default_avatar]
Vielen Dank für die schnellen Rückmeldungen.

Ich poste einmal meinen Code, aber wie gesagt ich bin noch Anfänger.

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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
use DBI();
use FileHandle();
use IO::File;

#--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
#Dekleration benötigter Variablen
#--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
my ($TicketNumber, $Year, $Month, $FiscalYear, $TicketTitle, $Category, $Problemtype, $Component,
$SLA, $EscalationLevel, $Status, $Priority, $Queue, $Customer, $CustomerUserID, $TicketOwner,
$DirectSolve, $Hostname, $Created, $Solved);
#--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
#DB Connection aufbauen
#--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
my $DB_NAME = "otrs_test";
my $DB_DSN = "DBI:mysql:database=$DB_NAME";
my $DB_USER = "******";
my $DB_PASSWD = "*****";

my $dbh = DBI->connect($DB_DSN, $DB_USER, $DB_PASSWD) or die "Fehler bei Datenbankverbindung";
#--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
#Erstellen der Tabelle TicketData
#--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
my $SQL_CreateTable = "CREATE TABLE TicketData(
TicketNumber VARCHAR(50) ,
Year YEAR,
Month INT,
FiscalYear YEAR,
TicketTitle VARCHAR(255),
Category VARCHAR(50),
Problemtype VARCHAR(50),
Component VARCHAR(50),
SLA VARCHAR(20),
EscalationLevel TINYINT,
Status VARCHAR(20),
Priority VARCHAR(20),
Queue VARCHAR(50),
Customer VARCHAR(100),
CustomerUserID VARCHAR(100),
Ticketowner VARCHAR(50),
Directsolve TINYINT,
Hostname VARCHAR(20),
Created DATETIME,
Solved DATETIME,
PRIMARY KEY (TicketNumber)
)";
my $Abfrage = $dbh->prepare($SQL_CreateTable);
$Abfrage->execute();
#--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
#Export zum Lesen öffnen
#--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
open(FH, '<c:\ExportOtrsStammdaten.csv') || die "Datei wurde nicht gefunden\n";
my @Content =<FH>;
close(FH);

my $Zeile;
foreach $Zeile (@Content) { #bei diesem Aufruf steht jeweils des aktuelle Wert von Content in der skalaren Variable
#print "$Zeile";
($TicketNumber, $Year, $Month, $FiscalYear, $TicketTitle, $Category, $Problemtype, $Component,
$SLA, $EscalationLevel, $Status, $Priority, $Queue, $Customer, $CustomerUserID, $TicketOwner,
$DirectSolve, $Hostname, $Created, $Solved) = split(/;/,$Zeile);

#my $sql = "INSERT INTO tbl_bsp SET bsp_artID=$sorte, bsp_text=$bezeichnung";

my $SQL_Insert = "INSERT INTO TicketData (
TicketNumber,
Year,
Month,
FiscalYear,
Category,
Problemtype,
Component,
SLA,
EscalationLevel,
Status,
Priority,
Queue,
Customer,
CustomerUserID,
TicketOwner,
DirectSolve,
Hostname,
Created,
Solved
)
VALUES (
$TicketNumber,
$Year,
$Month,
$FiscalYear,
$Category,
$Problemtype,
$Component,
$SLA,
$EscalationLevel,
$Status,
$Priority,
$Queue,
$Customer,
$CustomerUserID,
$TicketOwner,
$DirectSolve,
$Hostname,
$Created,
$Solved
)";

my $Abfrage1 = $dbh->prepare($SQL_Insert);
$Abfrage1->execute();
}

#--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
#Schließen der Datenbankverbindung
#--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
if ($dbh) {
$dbh->disconnect();
#print "DB Verbindung geschlossen";
}


Vielen Dank nochmal für Hilfe!
renee
 2008-04-02 18:33
#107757 #107757
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
pq hatte ja schon die Platzhalter erwähnt!

Mach
Code (perl): (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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
    my $SQL_Insert = "INSERT INTO TicketData (
                            TicketNumber,
                            Year,
                            Month,
                            FiscalYear,
                            Category,
                            Problemtype,
                            Component,
                            SLA,
                            EscalationLevel,
                            Status,
                            Priority,
                            Queue,
                            Customer,
                            CustomerUserID,
                            TicketOwner,
                            DirectSolve,
                            Hostname,
                            Created,
                            Solved
                            )
                      VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";

    my $Abfrage1 = $dbh->prepare($SQL_Insert);
    $Abfrage1->execute(
                            $TicketNumber,
                            $Year,
                            $Month,
                            $FiscalYear,
                            $Category,
                            $Problemtype,
                            $Component,
                            $SLA,
                            $EscalationLevel,
                            $Status,
                            $Priority,
                            $Queue,
                            $Customer,
                            $CustomerUserID,
                            $TicketOwner,
                            $DirectSolve,
                            $Hostname,
                            $Created,
                            $Solved
     );
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/
schiba82
 2008-04-02 19:00
#107760 #107760
User since
2008-04-02
6 Artikel
BenutzerIn
[default_avatar]
Vielen Dank für den Tipp mit den Platzhalter, aber wie kann ich das Thema mit dem Import der CSV Dateien lösen.
pq
 2008-04-02 19:08
#107761 #107761
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
schiba82+2008-04-02 16:31:02--
Vielen Dank für die schnellen Rückmeldungen.

Ich poste einmal meinen Code, aber wie gesagt ich bin noch Anfänger.

Code: (dl )
1
2
...
$DirectSolve, $Hostname, $Created, $Solved) = split(/;/,$Zeile);

hmm. und was machst du, wenn ein semikolon in einem wert vorkommt?
deshalb ist es besser, das mit einem CSV-modul einzulesen.
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
pq
 2008-04-02 19:08
#107762 #107762
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
schiba82+2008-04-02 17:00:49--
Vielen Dank für den Tipp mit den Platzhalter, aber wie kann ich das Thema mit dem Import der CSV Dateien lösen.

mit platzhaltern.
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
pktm
 2008-04-02 19:27
#107763 #107763
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Ich glaube mit der Frage war der Import der Daten gemeint.
Da bietet sich, wie bereits erwähnt, ein CSV-Modul an.
Ich nehme gerne http://search.cpan.org/search?query=dbd-csv&mode=a... dafür.
http://www.intergastro-service.de (mein erstes CMS :) )
<< |< 1 2 >| >> 11 Einträge, 2 Seiten



View all threads created 2008-04-02 17:56.