# Mit Java .txt-Datei in eine Datenbank einlesen lassen



## MarcoJava (5. Okt 2007)

danke für eueren Rat habe einfach 2 Methoden gemacht daraus und siehe da : es klappt . 

nun stehe ich aber für mich vor einem schier mir unmöglich zu bewältigendem Problem. 
Denke ohne eure hilfe (wieder einmal) wird das nix. 

Ok nun zu meinem Problem 

ich habe eine txt-Datei nennen wir sie mal test.txt 
Die Datei habe ich gleich in meinem Projekt ordner. 
die datei is wie folgt aufgebaut: 

"Anrede";"Vorname";"Nachname";"Strasse";"HNr";"PLZ";"Ort";"Vorwahl";"Rufnummer" 

natürlich ist meine tabelle auch mit den jeweiligen Spalten versorgt. 

hier ist mein ansatz von dem SQL-Befehl, der natürlich fehlerhaft ist leider. 



```
String updateString = "LOAD DATA LOCAL INFILE 'test.txt' INSERT INTO TABLE tabelle05 FIELDS TERMINATED BY ';' ENCLOSED BY ' " ' ESCAPED BY '\\' LINES TERMINATED BY '\r\n' IGNORE 1 LINES    ;" ;
```


Also den SQL Befehl bruache ich für eine Methode in Java. 
ich weiss zB nich wie ich " <-- ihm dieses symbole geben soll also das er weisst das der Inhalt Anrede "HIER DRINNE IST" 


bin für jeden Vorschlag seeeeehr dankbar 


PS melde mich ehute abend an wenn ich wieda @home bin auf jeden fall


_Dieser Beitrag wurde von L-ectron-X am 05.10.2007 um 13;54 Uhr editiert.
Code-Tags gesetzt, Doppelpost eliminiert, Benutzerantwort kopiert_


----------



## tuxedo (5. Okt 2007)

AFAIK kannst du den SQL-Befehl so nur dann nutzen, wenn du ihn direkt auf dem SQL-Server ausführst. Weil der Server erwartet, dass die File "test.txt" local verfügbar ist.


----------



## MarcoJava (5. Okt 2007)

ich weiss sry <--wegen doppelpost

ach ich muss sagen das ich jezz zum testen eine MS Access DB benutze. Sry hatte es vergessen zu sagen.

Dann is die datei ja local oder ? weil ich habe sie ja in meinem Projekt ordner.

Von der verfügbarkeit her is doch das gleiche Prinzip dann wie mit einer Bilddatei die ich in einem Frame haben möchte oder ? weil diese datei rufe ich ja auch nur mit:


```
JLabel backImgPanel = new JLabel(new ImageIcon("Logo.gif"));
```
und er findet sie also gilt ja das gleiche prinzip dann auch für die .txt-Datei oder sehe ich das flasch ?


----------



## tuxedo (5. Okt 2007)

Kenn mich mit Access nicht so aus, bin mir deshalb nicht sicher ob Access den SQL-Befehl überhaupt kennt. Ich weiß dass MySQL sowas kann, aber ob Access das auch kann: Keine Ahnung.

Wenn Access den Befehl beherrscht, dann kommts nicht drauf an ob Java auf die File zugreifen kann, sondern ob Access drauf zugreifen kann. Wobei das ja ein etwas "komischer" Fall ist:

Bei MySQL hat man ja eine DB-Instanz die auf die File zugreifen will. Bei Access ist es ja nur eine Datenbank-Datei. Und Datenbankdateien können nicht auf's Dateisystem zugreifen. Wenn der Befehl also geht, würde das heißen der Treiber muss auf die File zugreifen können.


----------



## MarcoJava (5. Okt 2007)

hmmm.... ok...danke soweit schonmal. 

vllt. weiss ja jmd anderes genau ob Access den befehl kennt.

du weisst auch nich zufällig ob Access CONCAT kennt ? weil würde auch gerne 2 Spalten zB

Strasse und Hnr zu StrasseHnr zusammenfügen


----------



## tuxedo (5. Okt 2007)

Google und die Microsoft-Webseite sind dein Freund ;-)

Solange du aber Access nicht als Pflichtvorgabe nutzen musst: Nimm was anderes.


----------



## MarcoJava (5. Okt 2007)

Ja werde es dann mit phpMyAdmin und MySQL machen.

du kennst dich ja auch in java etwas aus wie ich mercke da kann ich dich ja bestimmt noch was anderes fragen?


also um eine connection zu der DB in MySQL admin habe ich eine klasse geschrieben dafür die funktioniert also es kommt die system.out.print meldeung das er connected is

macht es sinn diese methode vor der eigentlichen Methode zu schreiben ?

ich geb mal ein beispiel:


```
private void jButton1ActionPerformed(...)
{
    connecttoDB(); <---die methode für die connection
    changeDataSet(); <-- die egeingeltiche methode die ausgeführt werden soll
}
```

weil so besteht dann doch nur immer eine verbindung zuz MySQL wenn ich eine benötige oda sehe ich das falsch ?

ich danke dir Alex für deine hilfestellung von gestern und heute !


----------



## tuxedo (5. Okt 2007)

Es macht keinen Sinn die DB Verbindung immer und immer wieder für jede Anfrage zu öffnen und sie hinterher wieder zu schließen (was du aber schließen solltest idt das ResultSet).

Du solltest auch deine GUI von deiner Logik trennen. Und möglichst auch die DB-Logik von der Programmlogik.

Dazu kannst du dein Programm in Schichten einteilen:

* GUI-Schicht
* Logikschicht
* DB-Schicht

Wenn das Programm nicht allzugroß ist, kannst du da 3 Hauptklassen bauen die miteinander referenziert sind. Wenn's größer wird kannst du die Schichten ja anhand von Packages ausseinander halten und statt mit Objektreferenzen die Schichten zu verbinden einfach Interfaces nehmen.

- Alex


----------



## MarcoJava (5. Okt 2007)

du hast recht.


habe dein Rat befolgt und eine MySQL DB erstellt so den zugriff und das auslesen von daten funktioniert.
nur hänge ich leider immmer noch an dem CONCAT-Problem, weil ich nicht ganz genau weiss wie die SQL Anweisung lauten muss.


```
String updateString = "LOAD DATA LOCAL INFILE 'test.txt' INSERT INTO TABLE tabelle05 FIELDS TERMINATED BY ';' ENCLOSED BY ' " ' ESCAPED BY '\\' LINES TERMINATED BY '\r\n' IGNORE 1 LINES ;" ;
```

soweit bin ich schon aber leider geht das nich ganz.


Jemand eine Idee ?? bzw du vllt ?


mfg


----------



## tuxedo (5. Okt 2007)

Ich würde mich nicht so an die DB binden und die ";"-getrennte Textfile mit Java zeilenweise in einen String einlesen und mit der String-Methode "split()" an den ";" splitten. Das daraus resultierende Array kannst du in ein Prepared Statement einfließen lassen und dann so auf der DB ausführen. 

- Alex


----------



## MarcoJava (5. Okt 2007)

oh man das klingt ziemlich schwer.
Zumal mein wissen über arrays ziemlich minimal bis nich vorhanden is

denkst du denn es geht nur so oder auch so wie ich vllt vorhabe?
weil wenn ich das per SQL mache also eine .csv datei importieren will, zeigt er mir folgenden SQL Befehl dafür an:


```
LOAD DATA LOCAL INFILE '/tmp/test' INTO TABLE 'adr1' FIELDS TERMINATED BY ';' ENCLOSED BY ' " '  ESCAPED BY '\\' LINES TERMINATED BY '\r\n' IGNORE 1 LINES
```

das beinhaltet die .txt Datei


```
"Herr";"Max;"Mustermann";"Musterstrasse";"12";"22222";Musterstadt";"040";"123456"
```



die 1. Line kann er ignorieren weil dort noch ma die spalten beschrifteung ist.

ne idee ?


----------



## tuxedo (5. Okt 2007)

Der Befehl sollte ja funktionieren. Du musst nur den Pfad zur Datei richtig angeben. 

'/tmp/test' würde nämlich heissen:

Du hast ein Linux-System in desses Temp-Verzeichnis "/tmp" eine Datei namens "test" liegt.

Ich nehme mal an du nutzt windows. Da könntest di folgendes probieren:

'c:/vsvdatei.csv'

Geht's nur um ein initielles befüllen der DB oder musst du das öfters machen?

Gruß
Alex


----------



## Guest (5. Okt 2007)

ich muss es öfters machen bzw es is ein bestandteil dres gesamten programms.

und nein leider geht die SQL Anweisung nicht.

denn ab 
	
	
	
	





```
'  ESCAPED BY '\\' LINES TERMINATED BY '\r\n' IGNORE 1 LINES"
```

zeigt er mir in Netbeans 5.5 alles grün an nich mehr rot so wie es sein sollte er kommt nich so recht mit den ' ' <- Zeichen klar.

daran scheitere ich gerade.


----------



## MarcoJava (5. Okt 2007)

meinst du das bringt was wenn ich anstatt alles ins '' setze also ';' es einfach in ( setzte ?


----------



## tuxedo (5. Okt 2007)

Probiers mal mit:


```
String sql = "LOAD DATA LOCAL INFILE 'c:/test' INTO TABLE 'adr1' FIELDS TERMINATED BY ';' ENCLOSED BY ' \" '  ESCAPED BY '\\\\' LINES TERMINATED BY '\\r\\n' IGNORE 1 LINES";
```

(Manche Zeichen muss man mit (mehreren) \ "escapen" damit sie so im String verbleiben und nicht zu Steuerzeichen werden die Java "auswertet").

Wie groß sind denn die CSV-Files?
Wenn sie nicht gerade hunderttausende von Zeilen enthalten würde ich die Files mit Java einlesen und normale SQL-Statements formen.

- Alex


----------



## MarcoJava (5. Okt 2007)

in meiner test.txt sind nur 36 datensätze drin

aba es können am ende millionen sein 


wennn ich einfach nur 
	
	
	
	





```
test.txt
```
schreibe und diese in meinem Projektordner habe dann müsste er sie ja auch finden oda weil der pfad dann ja absolut ist.

seh ich das richtig ?


----------



## tuxedo (5. Okt 2007)

MarcoJava hat gesagt.:
			
		

> schreibe und diese in meinem Projektordner habe dann müsste er sie ja auch finden oda weil der pfad dann ja absolut ist.
> 
> seh ich das richtig ?



nein, siehst du nicht. und ich habs dir schonmal erklärt: Nicht Java schickt die File IN die Datenbank sondern du sagst mit dem Statement der Datenbank nur wo sie die Datei bekommt. Und deshalb sollte der Pfad absolut sein. Denn der DB ist es wurscht wie die Anwendung aussieht oder wo sie auf der Platte liegt.

- Alex


----------



## MarcoJava (5. Okt 2007)

ich kann dir ja mal die Fehlermeldung zeigen die kommt



```
com.mysql.jdbc.exceptions.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'c:/test.txt' INTO TABLE tab01 FIELDS TERMINATED BY ';' ENCLOSED BY ' " '  ESCAPE' at line 1
```

und so sieht nun, dank dir  , mein sql befehl aus:



```
String updateString = "LOAD DATA LOCAL INFILE c:/test.txt' INTO TABLE tab01 FIELDS TERMINATED BY ';' ENCLOSED BY ' \" '  ESCAPED BY '\\\\' LINES TERMINATED BY '\\r\\n' IGNORE 1 LINES;";
```


----------



## Murray (5. Okt 2007)

Ist für ENCLOSED BY (wie auch für ESCAPED BY) nicht nur ein einzelnes Zeichen erlaubt, und nicht (wie bei TERMINATED BY) ein String?


----------



## tuxedo (5. Okt 2007)

Hmm, du meinst die Leerzeichen in:


```
' \" '
```

??

Wäre möglich. -> ausprobieren.


----------



## MarcoJava (5. Okt 2007)

also so ? 


```
'\"'
```

versteh ich das richtig ?


----------



## Murray (5. Okt 2007)

Ja


----------



## tuxedo (5. Okt 2007)

Wenn das nicht hilft: -> :###


----------



## MarcoJava (5. Okt 2007)

ja ich lese mich ja schon durchs halbe inet nur die befehle in java, alleine wegen der zeichensetzung, sind ja anders das ism ei9n prob ne funktionierenden mySQL befehl habe ich ja hatte ja ihn auch gepostet gehabt. Nur für java muss man ihn umschreiben.


ach und so wie ihr meintet gings leider nicht.

er hat schon ein prob vor dem 'c:/test.txt' 


```
com.mysql.jdbc.exceptions.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'c:/test.txt' INTO TABLE tab01 FIELDS TERMINATED BY ';' ENCLOSED BY ' " '  ESCAPE' at line 1
```

man man man da erwartet mich ja anscheinend noch einiges.


----------



## Murray (5. Okt 2007)

In der Fehlermeldung hast du allerdings immer noch die Leerzeichen rechts und links vom Anführungszeichen. Wird das Statement denn verstanden, wenn du den Laufwerksbuchstaben im Pfad zur Datei weglässt?  Funktionieren wird das dann zwar auch noch nicht, aber dann wäre wenigstens klar, wo der Syntax-Fehler liegt.


----------



## MarcoJava (5. Okt 2007)

ich habs jezz hinbekommen 

erliest sie ein und schreibt sich auch richtig ein. *freu*


vielen dank euch beiden !!!!!!!!!!!!!!!!!!!!!!!!!!!!


----------



## tuxedo (5. Okt 2007)

und wie hast du's jetzt gemacht? Poste doch mal deine Lösung, dann haben andere mit dem gleichen problem auch was davon.

- Alex


----------



## MarcoJava (5. Okt 2007)

```
String updateString = "LOAD DATA LOCAL INFILE 'text.txt' INTO TABLE tab02 FIELDS TERMINATED BY ';' ENCLOSED BY '\"'  ESCAPED BY '\\\\' LINES TERMINATED BY '\\r\\n' IGNORE 1 LINES; ";
```



die text datei liegt in meinem Projektordner.


jezz sitz ich gerade an dem prob das ich ansatt 'text.txt' eine variable vergeben möchte bzw 'text.txt' in eine variable stecke. doch was nehm ich String is falsch oder ?


mfg[/code]


----------



## Murray (5. Okt 2007)

Ein String wäre dafür schon OK.

```
String var = "test.txt";
String updateString = "LOAD DATA LOCAL INFILE '" + var +"' INTO TABLE tab02 FIELDS TERMINATED BY ';' ENCLOSED BY '\"'  ESCAPED BY '\\\\' LINES TERMINATED BY '\\r\\n' IGNORE 1 LINES; ";
```


----------



## MarcoJava (5. Okt 2007)

habs genau so gemacht wie du es mir gezeigt hast aber dann kommt die meldung:



```
java.sql.SQLException: Unable to open file ' test.txt 'for 'LOAD DATA LOCAL INFILE' command.Due to underlying IOException: 

** BEGIN NESTED EXCEPTION ** 

java.io.FileNotFoundException
MESSAGE:  test.txt  (Das System kann die angegebene Datei nicht finden)

STACKTRACE:

java.io.FileNotFoundException:  test.txt  (Das System kann die angegebene Datei nicht finden)
        at java.io.FileInputStream.open(Native Method)
        at java.io.FileInputStream.<init>(FileInputStream.java:106)
        at java.io.FileInputStream.<init>(FileInputStream.java:66)
        at com.mysql.jdbc.MysqlIO.sendFileToServer(MysqlIO.java:2820)
        at com.mysql.jdbc.MysqlIO.readResultsForQueryOrUpdate(MysqlIO.java:2074)
        at com.mysql.jdbc.MysqlIO.readAllResults(MysqlIO.java:1451)
        at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1787)
        at com.mysql.jdbc.Connection.execSQL(Connection.java:3250)
        at com.mysql.jdbc.Statement.executeUpdate(Statement.java:1355)
        at com.mysql.jdbc.Statement.executeUpdate(Statement.java:1270)
        at ShowDB.openDatasetSet(ShowDB.java:242)
        at ShowDB.actionPerformed(ShowDB.java:342)
        at java.awt.Button.processActionEvent(Button.java:392)
        at java.awt.Button.processEvent(Button.java:360)
        at java.awt.Component.dispatchEventImpl(Component.java:4410)
        at java.awt.Component.dispatchEvent(Component.java:4240)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:273)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:173)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:168)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:160)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:121)


** END NESTED EXCEPTION **
```

komisch oder ?


----------



## Murray (5. Okt 2007)

Da ist ein Leerzeichen vor dem ersten t im Dateinamen.


----------



## MarcoJava (5. Okt 2007)

hat sich erledigt. War mein fehler.


----------



## MarcoJava (5. Okt 2007)

Murray hat gesagt.:
			
		

> Da ist ein Leerzeichen vor dem ersten t im Dateinamen.




hehe ja habe ich auch gesehn eben  :roll:


----------



## MarcoJava (6. Okt 2007)

kennt einer den SQL befehl um genau das gegenteil zu machen ?

also eben habe ich ja ne txt-DAtei genommen und sie in die DB gespeichert.
Jetzt möchte ich genau das gegenteil machen also den Inhalt aus der DB in eine txt-Datei speichern und sie auf meinem Desktop speichern können.


Bin für eure Vorschläge dankbar.


mfg


----------

