Einzelne Spalte in MySQL-DB-Tabelle schreiben

  • Themenstarter Themenstarter nogod
  • Beginndatum Beginndatum
N

nogod

Gast
Hallo,

wie kann ich eine einzelne Spalte und ihre Datensätze von einem Textfile in eine Tabelle schreiben? Die Tutorials, die ich fand, schreiben alle Datensätze rein, aber das möchte ich ja nicht.

Die Spalten des Textfiles sehen so aus, wovon ich lediglich die Spalte Nummer benötige:

Typ;Datum;Zeit;Version;Nummer;Angebot;Nachfrage;Preis;Verkaufspreis;Absatz;Prognose;Ort;Land

Wie mache ich das? Meine Datenbank heißt Cust und die Tabelle heißt CustNo1.

Danke euch.
 
Das funktioniert leider doch nicht so, wie ich mir das vorgestellt hatte..

Konkret sieht meine Datei so aus:

Nummer.dat

Code:
Typ;Datum;Zeit;Version;Nummer;Angebot;Nachfrage;Preis;Verkaufspreis;Absatz;Prognose;Ort;Land
A;01.10.2011;10:00:05,010;     ;3228.5;288;0;0;0;0;;;0
A;01.10.2011;10:00:05,520;     ;3134.5;1;0;0;0;0;;;0
A;01.10.2011;10:00:05,520;     ;3357;22;0;0;0;0;;;0
A;01.10.2011;10:00:05,520;     ;3643.5;4;0;0;0;0;;;0
A;01.10.2011;10:00:05,520;     ;3546;11;0;0;0;0;;;0

Hat vielleicht jemand ein Minimalbeispiel wie ich mit Java dieses Textfile als Tabelle in meiner Datenbank so wie sie ist anlegen kann?

Ich hab zwar einiges versucht, aber es nicht hinbekommen.
 
Deinen Tipp verstehe ich nicht und er bringt mir auch im Endeffekt nichts, da ich nach einem Minimalbeispiel fragte.

Das ist das, was ich versucht habe:

Java:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
import java.sql.ResultSet;
import java.sql.SQLException;

@SuppressWarnings("unused")
public class AutomateImport
{
    public static void main(String[] args) 
    {
        DBase db = new DBase();
        Connection conn = db.connect(
    "jdbc:mysql://localhost:3306/nummer","root","root");
        db.importData(conn,"Nummer.dat");
    }

}

class DBase
{
    public DBase()
    {
    }

    public Connection connect(String db_connect_str, 
  String db_userid, String db_password)
    {
        Connection conn;
        try 
        {
            Class.forName(  
    "com.mysql.jdbc.Driver").newInstance();

            conn = DriverManager.getConnection(db_connect_str, 
    db_userid, db_password);
        
        }
        catch(Exception e)
        {
            e.printStackTrace();
            conn = null;
        }

        return conn;    
    }
    
    public void importData(Connection conn,String filename)
    {
        Statement stmt;
        String query;

        try
        {
            stmt = conn.createStatement(
    ResultSet.TYPE_SCROLL_SENSITIVE,
    ResultSet.CONCUR_UPDATABLE);

            query = "LOAD DATA INFILE '"+filename+
    "' INTO TABLE  (Typ,Datum,Zeit,Version,Nummer,Angebot,Nachfrage,Preis,Verkaufspreis,Absatz,Prognose,Ort,Land);";

            stmt.executeUpdate(query);
                
        }
        catch(Exception e)
        {
            e.printStackTrace();
            stmt = null;
        }
    }
};


Ich bekomme allerdings folgende Exception:
Java:
com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data too long for column 'typ' at row 1
	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3564)
	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3498)
	at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1959)
	at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2113)
	at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2562)
	at com.mysql.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1664)
	at com.mysql.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1583)
	at com.tm3.forecast.show.DBase.importData(AutomateImport.java:65)
	at com.tm3.forecast.show.AutomateImport.main(AutomateImport.java:17)

Außerdem ist es nicht genau das, was ich möchte. Ich möchte ja eben die Tabelle dynamisch aus dem .dat-File heraus erzeugen.

Wenn ich Dutzende solcher Files habe, dann ist es unsinnig jedesmal per Hand Tabellen in meiner Datenbank zu erzeugen. Kann mir jemand vielleicht helfen dies zu automatisieren?
 
Kettle von Penthaho kann das automatisieren.

Ansonsten hat deine erste spalte einen Wert der über den Wertebereich der Spalte in der Tabelle geht.

Beispiel: Du hast boolean (1/0) und du versuchst 2 einzutragen.

Gruß,

Martin
 
zum einen würde ich es mit "IGNORE 1 LINES" in deinem statement versuchen, damit er die erste zeile nicht versucht in die spalten zu quetschen. ausserdem glaube ich nicht das er im standard nach semikolon seperiert, das solltest du ihm vielleicht auch mitteilen. aber google ist dein freund, einfach mal den "LOAD DATA INFILE"-Befehlt vielleicht etwas genauer angucken
 
was Marcinek mit seinem kommentar meinte:
du liest deine textdatei mit einer schleife zeilenweise ein.
jede zeile repräsentiert dabei einen deiner DB-Eintrag. daraus kannst du dir Objekte erstellen und mit diesen weiterarbeiten.
ansonsten, um nicht alle daten einzulesen sondern nur die spalte nummer, einfach nur bis zum gewünschten wert lesen und dann nächste zeile aufrufen.
 

Zurück
Oben