Sascha: Problem mit Trennzeichen in einer CSV-Datei

Hallo Forum!

Nachdem ich von Euch viele hilfreiche Tipps bekommen und (weitestgehend) umgesetzt habe. Habe ich ein weiteres Problem...

Das Anlegen der CSV-Datei ansicht ist kein Problem (mehr;-)

Aber Meine Ausgabe hat allerdings immernoch nicht den gewünschten erfolg.

Hierzu ein Beispiel ich hoffe es lässt sich erkennen...
Zeile 1:
hostID,hostname,admin,locationID,dhcp_enable,osversionID,in_use,dnsdomainID,dns_enable,deviceclassID,organizationunitID,user,date_establishment,causer_adminID,date_modify,modify_adminID,date_last_activity,comment,time

Zeile 2:
1,xsrv1,NULL,71,Yes,28,Yes,24,Yes,5,8,,20030812121840,2,00000000000000,0,00000000000000,---,00000000
Zeile 3:
2,rz5,NULL,285,No,28,Yes,24,Yes,10,8,,20030812121840,2,00000000000000,0,00000000000000,---,00000000

Zeile 3:
8,se24-09,NULL,245,Yes,7,Yes,24,Yes,1,8,,20030430115449,2,00000000000000,0,00000000000000,Zuordnung: , Bemerkung: Pool SE24
,00000000

Hier liegt der Hase im Pfeffer.... das Feld 'comment' hat unter anderem auch Kommata inne siehe oben ("Zuordnung: , Bemerkung: Pool SE24")

Die bisherige Lösung habe ich modifiziert (durch die Hinweise von gestern)

while($row = mysql_fetch_row($result)) {
$array = $row;

$separated = addslashes(implode(";", $array));

print ($separated."\n");
}

Wie kann ich jetzt die einzelne Felder in Anführungszeichen setzten?

Viele Grüße

Sascha

  1. Zeile 3:
    8,se24-09,NULL,245,Yes,7,Yes,24,Yes,1,8,,20030430115449,2,00000000000000,0,00000000000000,Zuordnung: , Bemerkung: Pool SE24
    ,00000000

    Zusätzlich wird die Zeile nach "Zuordnung: , Bemerkung: Pool SE24" umgebrochen und neu angefangen..
    Zeile:
    8,se24-09,NULL,245,Yes,7,Yes,24,Yes,1,8,,20030430115449,2,00000000000000,0,00000000000000,Zuordnung: , Bemerkung: Pool SE24
    Zeile:
    ,00000000

    Vielen Dank für Eure hilfe

    Sascha :-)

    1. Hallo Sascha,

      Wie kann ich jetzt die einzelne Felder in Anführungszeichen setzten?

      In dem Du ganz einfach den Seperator entsprechend modizierst und am Anfang und Ende des Strings ebenfalls Anführungszeichen ranbastelst.

      Zusätzlich wird die Zeile nach "Zuordnung: , Bemerkung: Pool SE24" umgebrochen und neu angefangen..

      Aber doch nicht in Deiner CSV-Datei, nur auf dem Bildschirm oder?

      Gruss AndreD

      1. Hallo AndreD

        In dem Du ganz einfach den Seperator entsprechend modizierst und am Anfang und Ende des Strings ebenfalls Anführungszeichen ranbastelst.

        Angenommen ich modifiziere den Seperator so ("",", $array) dann bekomme ich doch
         1","blaa","usw."

        ich müsste dann aber "1","blaa","usw." dann haben..

        Aber doch nicht in Deiner CSV-Datei, nur auf dem Bildschirm oder?

        Also wenn ich die Datei in Excel (nicht schlagen ;-) betrachte wird Sie umgebrochen... auch wenn ich Sie im Notepad betrachte...

        Gruss AndreD

        Grüsse

        Sascha

        1. uuups es muss so dann aussehen ("","", $array)

          1","blaa","usw."

        2. Hallo Sascha,

          ich müsste dann aber "1","blaa","usw." dann haben..

          Ja dann lies doch bitte nochmal genau was ich geschrieben habe:

          In dem Du ganz einfach den Seperator entsprechend modizierst und am Anfang und Ende des Strings ebenfalls Anführungszeichen ranbastelst.

          Also wenn ich die Datei in Excel (nicht schlagen ;-) betrachte wird Sie umgebrochen... auch wenn ich Sie im Notepad betrachte...

          In CVS sollte eigentlich erst nach einem "richtigen" Zeilenumbruch umbrochen werden. Mach mal am Ende einer jeden Zeile ein \n für einen Umbruch ran. Also z.B. $csv .= [Dein String in welcher Form auch immer] . "\n";

          Ausserdem ist IMHO Excel nicht wirklich die beste Möglichkeit CSV-Dateien zu betrachten, da Excel jede Zeile in nur eine Zelle pro Spalte schreibt anstatt diese seperiert darzustellen. Benutze am besten einen gescheiten Texteditor Deiner Wahl (z.B. Ultraedit auf Win32 oder bbEdit, jEdit auf Linux) zur Kontrolle...

          Gruss AndreD

          1. Hallo AndreD

            Habs genau gelesen :-) und auch verstanden...jetzt ;-)

            In CVS sollte eigentlich erst nach einem "richtigen" Zeilenumbruch umbrochen werden. Mach mal am Ende einer jeden Zeile ein \n für einen Umbruch ran. Also z.B. $csv .= [Dein String in welcher Form auch immer] . "\n";

            Die Geschichte mit "\n" ist bei mir korrekt... Aber der Umbruch ist trotzdem da... ich habe im hexEdit nachgeschaut... vermutlich rappelts an den Daten aus der DB?!

            Viele Grüße

            Sascha

            1. Hallo Sascha,

              Die Geschichte mit "\n" ist bei mir korrekt... Aber der Umbruch ist trotzdem da... ich habe im hexEdit nachgeschaut... vermutlich rappelts an den Daten aus der DB?!

              Tja, mehr als vermuten kann ich leider auch nicht. Du musst Dir halt mal die Daten aus der DB ausgeben lassen und schauen ob da ein Umbruch mit drinne ist. Wenn Du tatsächlich inmitten Deiner Daten einen Umbruch gibt, kann das auch an einem Leerzeichen liegen, AFAIK kann es sein das ein Leerzeichen wie ein \n gewertet wird... also wenn in Deiner DB ein Feld mit "Wert " gefüllt ist kann das der Fehler sein.

              Noch ein Tipp: Es ist leichter wenn Du Dir ein Testszenario mit einer kleinen CSV-Datei machst die nur 3-4 Felder und ein paar Datensätze hat. Sobald diese mit normalen Daten (Also keine Sonderzeichen) läuft, testest Du das ganze mit Daten die Kommas, Semikolons, Anführungszeichen etc. enthalten und schaust ob Fehler auftreten. So fällt es Dir leichter Fehler zu analysieren und einzukreisen. Wenn es dann mit der kleinen CSV-Datei läuft sollte es auch mit einer grösseren laufen...

              Weiterhin viel Spass,
              Gruss AndreD

  2. Ich habe den Fehler gefunden yuhuuuu :-)

    In der Datenbank waren Abatzzeichen gespeichert... naja und mit chop($meinfeld[x]) habe ich das Problem lösen können.

    Danke AndreD für Deine hilfe

    viele Grüße

    Sascha