itwasme2001: CSV in MSSQL importieren

Ich versuche nun schon seit Tagen eine CSV mit Hilfe von PHP in eine Tabelle einer MSSQL Datenbank zu importieren.. Aber er fügt mir jedes Mal nur eine leere Zeile an...

sieheCode

  
  
  
$csv_datei = "C:/test.csv";  
$handle = fopen ($csv_datei, "r");         //Handle erstellen  
while(!feof($handle)){                            //solange nicht am ende der Datei  
    $line = fgets($handle);                       //Einlesen einer Zeile  
    list($w, $x, $y, $z) = explode(";",$line);    //Trennen wo ;  
}  
fclose ($handle);  
  
list($w, $x, $y, $z) = explode(";", $line);   //Trennen wo ;  
$query="insert into dbo.Tebis (idtext, einheit, datum, wert) values ('$w', '$x', '$y', '$z')"; //Erstellen des SQL Querys  
  
//Connect...  
  
  
$server = 'LAPTOPMM\####';  
  
// Mit MSSQL verbinden  
$verbindung = mssql_connect($server, '####', '####');  
  
if (!$verbindung) {  
    die('Beim Aufbau der Verbindung mit MSSQL ging etwas schief');  
}  
  
  
mssql_select_db("energy_db", $verbindung) or die("...");  
  
//Einfügen der Daten  
mssql_query($query);  
  
//Verbindung Trennen  
mssql_close($verbindung);  
  

  1. In erster linie fällt auf, dass du Handwagerl fährst - warum nimmst du nicht fgetcsv()?

    Weiters, hast du schon Debug-Ausgaben gemacht?

    1. In erster linie fällt auf, dass du Handwagerl fährst - warum nimmst du nicht fgetcsv()?

      Weiters, hast du schon Debug-Ausgaben gemacht?

      Okay das funktioniert nun.. zumindest kann ich die Datei mal ausgeben...
      Wie bekomme ich jetzt das Ganze in eine Tabelle..???

      1. Weiters, hast du schon Debug-Ausgaben gemacht?

        Wie bekomme ich jetzt das Ganze in eine Tabelle..???

        Mit einem SQL-INSERT-Statement

        Mach doch bitte einfach Debug-Ausgaben, bevor du weitere inhaltsleere Frage stellst - mysql_error() könnte dich auch interessieren.

        1. Weiters, hast du schon Debug-Ausgaben gemacht?

          Wie bekomme ich jetzt das Ganze in eine Tabelle..???

          Mit einem SQL-INSERT-Statement

          Mach doch bitte einfach Debug-Ausgaben, bevor du weitere inhaltsleere Frage stellst - mysql_error() könnte dich auch interessieren.

          Also nochmal, ich hoffe dieses mal nicht inhaltslos...

          Ich glaube mir fehlt schon allein mal den Schritt wie nun aus dem Array in welchem nun meinen CSV steht ich eine Schleife baue um die Daten in einen Insert Befehl zu packen.. Error brauche ich erst mal nicht ....

          1. Ich glaube mir fehlt schon allein mal den Schritt wie nun aus dem Array in welchem nun meinen CSV steht ich eine Schleife baue um die Daten in einen Insert Befehl zu packen.. Error brauche ich erst mal nicht ....

            Das ist ja schon mal was.

            Wie muss den dann INSERT-Statement für einen - und wie muss das INSERT-Statement für 2 oder mehr Aatensätze denn aussehen?

            1. Ich glaube mir fehlt schon allein mal den Schritt wie nun aus dem Array in welchem nun meinen CSV steht ich eine Schleife baue um die Daten in einen Insert Befehl zu packen.. Error brauche ich erst mal nicht ....

              Das ist ja schon mal was.

              Wie muss den dann INSERT-Statement für einen - und wie muss das INSERT-Statement für 2 oder mehr Aatensätze denn aussehen?

              ??? Hä ??
              Insert into Tabelle.wert1, Tabelle.wert2, Tabelle.Wert3 Values (Wert1, Wert2, Wert3);
              So und wie sage ich jetzt dass wert1 und wert2 und wert3 aus dem array kommen ??

              1. Insert into Tabelle.wert1, Tabelle.wert2, Tabelle.Wert3 Values (Wert1, Wert2, Wert3);

                Kannst du das bitte vorher verifizieren?

                Und dann fehlt natürlich immer noch das Statement für 2 oder merh datensätze - dein CSV wird wohl nicht nur einen Datensatz haben.

                So und wie sage ich jetzt dass wert1 und wert2 und wert3 aus dem array kommen ??

                Die Dokumentation von fgetcsv() hast du bereits gelesen?

                1. Insert into Tabelle.wert1, Tabelle.wert2, Tabelle.Wert3 Values (Wert1, Wert2, Wert3);

                  Kannst du das bitte vorher verifizieren?

                  Und dann fehlt natürlich immer noch das Statement für 2 oder merh datensätze - dein CSV wird wohl nicht nur einen Datensatz haben.

                  So und wie sage ich jetzt dass wert1 und wert2 und wert3 aus dem array kommen ??

                  Die Dokumentation von fgetcsv() hast du bereits gelesen?

                  Habe es jetzt mal... aber bekomme immer Falsche Syntax in der Query

                    
                  $row = 1;                                      // Anzahl der Arrays  
                  $handle = fopen ("test.csv","r");              // Datei zum Lesen öffnen  
                  while ( ($data = fgetcsv ($handle, 1000, ";")) !== FALSE ) { // Daten werden aus der Datei  
                                                                 // in ein Array $data gelesen  
                    
                  print_r ($data);  
                    
                        $query ="INSERT INTO dbo.Tebis.idtext, dbo.Tebis.einheit, dbo.Tebis.datum, dbo.Tebis.wert  VALUES ('$data[0][0]', '$data[0][1]','$data[0][2]','$data[0][3]')";  
                             //Einfügen der Daten  
                  mssql_query($query);  
                    
                    
                    
                  }  
                  fclose ($handle);
                  
                  1. Habe es jetzt mal... aber bekomme immer Falsche Syntax in der Query

                    Das sagte ich dir bereits - also, kannst du bitte in der Dokumentation deines DMBS nachschlagen, wie ein Insert-Statement auszusehen hat?

                    Weiters solltest du dich um eine kontextgerechte Behandlung der Werte kümmern.

              2. Hi!

                So und wie sage ich jetzt dass wert1 und wert2 und wert3 aus dem array kommen ??

                Array-Zugriff ist Grundlagenwissen.

                Lo!

            2. Hi!

              Wie muss den dann INSERT-Statement für einen - und wie muss das INSERT-Statement für 2 oder mehr Aatensätze denn aussehen?

              Die zweite Teilfrage können wir uns schenken. Es existiert ja bereits eine Schleife, die aus der Datei einzelne Datensätze ausliest. Innerhalb dieser kann auch gleich das Insert für diesen gerade geholten Datensatz stehen. Da muss man nicht erst die CSV-Daten komplett zwischenspeichern und daraus ein Multi-Insert erstellen, bei dem man im Falle eines Fehler auch nicht gleich erkennt, welcher der vielen Datensätze das Problem erzeugt hat.

              Zudem ist es MS-SQL und nicht MySQL, da hilft also auch kein mysql_error() sondern mssql_get_last_message() für einen Fehlermeldungstext. Dass überhaupt ein Fehler aufgetreten ist, sieht man an den Rückgabewerten der Funktionen (z.B. mssql_query()), den man aber auswerten und nicht ignorieren muss.

              Und auch hier ist der Kontextwechsel zu beachten. Es gibt aber keine eigene Funktion zum Entschärfen der in den Daten enthaltenen einfachen Anführungszeichen. Diese können aber mit str_replace() in doppelte ausgetauscht werden.

              Lo!

              1. Die zweite Teilfrage können wir uns schenken. Es existiert ja bereits eine Schleife, die aus der Datei einzelne Datensätze ausliest. Innerhalb dieser kann auch gleich das Insert für diesen gerade geholten Datensatz stehen. Da muss man nicht erst die CSV-Daten komplett zwischenspeichern und daraus ein Multi-Insert erstellen, bei dem man im Falle eines Fehler auch nicht gleich erkennt, welcher der vielen Datensätze das Problem erzeugt hat.

                In einer Schleife zehntausende INSERTS abfeuern ist aber nich grade der Renner - in einem mehrzeiligen Statement ist zudem auch klar ersichtlich, in welcher Zeile der Fehler auftritt.

                Man sollte die INSERT-Statements zumindest Blockweise absetzen - sagen wir immer 100 Stück gemeinsam. Das macht die Sache deutlich schneller.

                Zudem ist es MS-SQL und nicht MySQL, da hilft also auch kein mysql_error() sondern mssql_get_last_message() für einen Fehlermeldungstext.

                Mein Fehler, das hab' ich glatt überlesen.

                1. Hi!

                  In einer Schleife zehntausende INSERTS abfeuern ist aber nich grade der Renner - in einem mehrzeiligen Statement ist zudem auch klar ersichtlich, in welcher Zeile der Fehler auftritt.

                  Wieviele das sind, ist doch gar nicht bekannt. Und da nimmt man zuerst den einfachsten Weg und macht sich um Performance Gedanken, wenn es notwendig wird. Zudem nahm ich an, du meinst die Multi-Insert-Syntax, wie sie in MySQL existiert (ob MSSQL sie kann, weiß ich nicht), bei der man ein INSERT-Statement mit mehreren Datensätzen abfeuern kann.

                  Lo!