Import einer csv-Datei in eine H2-Database

  • Themenstarter Themenstarter Guest
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
G

Guest

Gast
Gibt es eine Möglichkeit, eine csv-Datei in eine H2-Datenbank zu importieren?
 
Einfache Antwort: Ja, sogar mehrere. ;-)

Was willst du noch wissen?
 
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.
 
Code:
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?
 
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
 
@ 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:

Code:
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?
 
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:

Code:
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
 
@ alex0801

habs anders lösen können - mit Hilfe von Access und csv-Dateien. Bisschen umschupsen, insert-Anweisung einbinden - fertig.
 
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
 
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 ...
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben