# Import einer csv-Datei in eine H2-Database



## Guest (28. Nov 2007)

Gibt es eine Möglichkeit, eine csv-Datei in eine H2-Datenbank zu importieren?


----------



## tuxedo (28. Nov 2007)

Einfache Antwort: Ja, sogar mehrere. ;-)

Was willst du noch wissen?


----------



## Guest (28. Nov 2007)

Ich gehe über den Browser http://localhost:8062/login.

Wie kann ich die csv-Datei importieren?


----------



## tuxedo (28. Nov 2007)

Entweder du bastelst dir ein kleines (Java?)Programm das die CSV einliest und die Daten in ein oder mehrere Statements bastelt und diese(s) dann ausführt, ODER du schaust in's Handbuch von H2 und prüfst ob H2 einen Befehl anbietet mit dem man CSV direkt importieren kann.


----------



## Guest (28. Nov 2007)

```
package org.h2.tools;
import java.sql.*;

public class Test 
{
  public static Connection connection;
  public static String lese, schreibe;
  public static Statement stmt;
  public static ResultSet result;
  
  public static void main(String[] a) throws Exception 
  //public static void verbindung() throws Exception
  {
    Class.forName("org.h2.Driver");
    connection = DriverManager.
      getConnection("jdbc:h2:tcp:localhost/test", "sa", "");
      System.out.println("Verbindung hergestellt"); 
    // add application code here
    
    ResultSet rs = Csv.read("test.csv", null, null);
	ResultSetMetaData meta = rs.getMetaData();
	while(rs.next()) 
	{
    	for(int i=0; i<meta.getColumnCount(); i++) 
    	{
        	System.out.println(meta.getColumnLabel(i+1) + ": " + rs.getString(i+1));
    	}
    	System.out.println();
	}
	rs.close();
    
    lese = "Select * from test";
	stmt = connection.createStatement();
	 	
	result = stmt.executeQuery(lese);
	System.out.println(result);
	
	StartFrame frm = new StartFrame("Hauptseite");
	frm.setVisible(true);
	frm.setSize(400,400);
	frm.setLocation(0, 0);
	frm.pack();
  }
}
```

Hier bekomme ich die Fehlermeldung: 


> non-static method read(java.lang.String,java.lang.String[],java.lang.String) cannot be referenced from a static context
> ResultSet rs = Csv.read("icd_2008.csv", null, null);



Was mache ich falsch?


----------



## tuxedo (28. Nov 2007)

a) Woher sollen wir wissen was die Klasse Csv macht?
b) Du greifst auf eine read() Methode der Csv-Klasse zu, welche nicht als "static" deklariert ist (non-static method cannot be referenced from a static context -> lesen bildet!)
c) Du benutzt keine Try/Catch-Blöcke. Folglich kannst du kein e.printStackTrace(); machen. 
d) Mir scheint du hast einige Basics von Java nicht verinnerlich

- Alex


----------



## Guest (28. Nov 2007)

@ alex0801

Ich habe das Beispiel aus dem Handbuch von H2. Da steht:



> Reading a CSV File from a Java Application
> 
> It is possible to read a CSV file without opening a database. Example:




```
ResultSet rs = Csv.read("test.csv", null, null);
ResultSetMetaData meta = rs.getMetaData();
while(rs.next()) {
    for(int i=0; i<meta.getColumnCount(); i++) {
        System.out.println(meta.getColumnLabel(i+1) + ": " + rs.getString(i+1));
    }
    System.out.println();
}
rs.close();
```

Lesen kann ich auch, aber wie kann ich das jetzt so umbauen, dass ich es auslesen kann?


----------



## tuxedo (28. Nov 2007)

Tja, da scheint die Anleitung etwas "knapp" gehalten zu sein.

Die Csv Klasse kannst du nicht statisch verwenden. Du musst davon erst ein Objekt erzeugen ...weil:


```
public ResultSet read(String fileName, String colNames[], String charset)
        throws SQLException
```
Da ist halt nix mit "static" in der Methodensignatur.

Eine CSV-File kannst du aber auch mit einem FileReader zeilenweise auslesen und mit String#split() jeweils eine Zeile in ein String[] wandeln. Dann hast du im String[] die einzelnen Spalten der Zeile.

Daraus generierst du dir dann pro Zeile einfach ein SQL-Statement (INSERT blablabla). Die Statements kannst du dann entweder wieder ein eine File stecken und zwischenspeichern, oder du führst die gleich mit dem H2 jdbc auf der H2 Datenbank aus.

- Alex


----------



## Guest (28. Nov 2007)

@ alex0801

habs anders lösen können - mit Hilfe von Access und csv-Dateien. Bisschen umschupsen, insert-Anweisung einbinden - fertig.


----------



## tuxedo (28. Nov 2007)

Access? Nein wie eklig. Hoffe du hast das nur als Zwischenstation genommen. Denn hier sind schon etliche mit Access verzweifelt. Hab auch noch keinen gesehen der Access in Verbindung mit Java empfehlen konnte.

- Alex


----------



## DocRandom (28. Nov 2007)

..och alex, Abszess (Access) ist doch was nettes *fg*
Zumindest nur solange es in meiner VM läuft!

lg
DocRandom


----------



## tuxedo (28. Nov 2007)

Abszess ... nette Umschreibung ;-) Muss ich mir merken ...


----------



## HoaX (28. Nov 2007)

gut dass direkt über dem beispeil das gast gepostet hat in der doku steht dass auch ein "SELECT * FROM CSVREAD('test.csv');" funktioniert ... ganz ohne java, sogar über weboberfläche ...


----------

