Kai: csv Datei einlesen

Hallo Forum,

ich lese eine csv-Datei ein, deren

  
$array = file("myfile.csv"); // Datei in ein Array einlesen  
$ende= count($array);  
  
if (!isset($_REQUEST['ablauf'])) {  
$zahl=0;  
} else {  
$zahl=$_REQUEST['ablauf'];  
}  
  
if (($zahl+1000) < $ende) {  
$ablauf=$zahl+1000;  
} else {  
$ablauf=$ende;  
}  
  
echo ("Es werden $ende Datensätze eingelesen: Datensatz $zahl bis $ablauf<BR>");  
  
// Schleife  
  
for($count = $zahl; $count < $ablauf+1; $count++)  
  {  
if ($count == $ende) {  
	echo ("Der Datenimport wurde durchgeführt");  
exit;  
}  
  
// Ab hier mach was mit den Daten  
  
 $zeilen=explode("|", $array[$count]);  

deren 7. Feld ein per Hochkomma eingeschlossener, zum Teil mehrzeiliger String ist.

Wie muß ich den in php nun behandeln, damit ich ihn in eine db dann auch mehrzeilig korrekt eintragen kann?

Mir geht es nicht um den zu behandelnden Kontextwechsel. Den beachte ich wohl. Es geht mir mehr darum, php erstmal klar zu machen, dass da eventuell mehrere Zeilen zum String gehören könnten. Gibt es einen explode-parameter, der sowas kann?

Ich hätte sicher besser

  
$fp = fopen("my_file.csv", "r");  
$zeilen = array();  
  
while( !feof($fp) ) {  
    $zeilen[] = fgetcsv  ( $fp  , 4096 , ";" , "\"" );  
}  
  

so eingelesen, oder?

Aber davon mal unabhängig, wenn ich alles beim alten ließe, könnte ich php dennoch klar machen, dass es sich eventuell um einen mehrzeiligen String handeln könnte?

Kai

  1. Tach!

    ich lese eine csv-Datei ein, deren

    $array = file("myfile.csv"); // Datei in ein Array einlesen

    [...]
    $zeilen=explode("|", $array[$count]);

    
    >   
    > deren 7. Feld ein per Hochkomma eingeschlossener, zum Teil mehrzeiliger String ist.  
    > Wie muß ich den in php nun behandeln, damit ich ihn in eine db dann auch mehrzeilig korrekt eintragen kann?  
      
    Zu spät.  
      
    
    > Mir geht es nicht um den zu behandelnden Kontextwechsel. Den beachte ich wohl. Es geht mir mehr darum, php erstmal klar zu machen, dass da eventuell mehrere Zeilen zum String gehören könnten. Gibt es einen explode-parameter, der sowas kann?  
      
    Nein, das explode() ist nicht das Problem, das ignoriert die Zeilenumbrüche. Du übergibst dem explode() jedoch bereits eine einzelne Zeile, die schon lange vorher durch die file()-Funktion zurechtgeschnitten wurde.  
      
    
    > Ich hätte sicher besser  
    > [mit fgetcsv]  
    > so eingelesen, oder?  
      
    Genau. Das liest die Datei ordnungsgemäß, wenn die Felder korrekt erstellt sind, also Einrahmungen - und dabei darin enthaltene Einrahmungszeichen ebenfalls beachten.  
      
    
    > Aber davon mal unabhängig, wenn ich alles beim alten ließe, könnte ich php dennoch klar machen, dass es sich eventuell um einen mehrzeiligen String handeln könnte?  
      
    Jedenfalls nicht mit file(). Und dann müsstest du dir einen Parser schreiben, den es aber in Form von fgetcsv() schon gibt.  
      
      
    dedlfix.
    
    1. dedlfix.

      Wieder mal ne perfekte, umfassende Antwort, die keine Rückfragen offen hält, deshalb anstelle von Rückfragen ein Dankeschön für Deine Teilnahme hier im Forum.

      Kai

      1. dedlfix.

        Wieder mal ne perfekte, umfassende Antwort, die keine Rückfragen offen hält, deshalb anstelle von Rückfragen ein Dankeschön für Deine Teilnahme hier im Forum.

        Leider doch eine Rückfrage (PHP Version > 5.3)

          
        $filename = 'test.csv';  
          
        $array = str_getcsv ($filename,"|","'","\\");  
          
        echo("<pre>");  
        print_r($array);  
        echo("<pre>");  
        exit;  
        
        

        ergibt

        Array
        (
            [0] => test.csv
        )

        Ich hatte jetzt ein assoziatives Array erwartet.

        Kai

        1. Moin!

          $array = str_getcsv ($filename,"|","'","\");

          Ich hatte jetzt ein assoziatives Array erwartet.

          Und wo definierst du, wie die nullte, erste, zweite,... Spalte heißen soll?

          - Sven Rautenberg

          1. Moin!

            $array = str_getcsv ($filename,"|","'","\");

            Ich hatte jetzt ein assoziatives Array erwartet.

            Und wo definierst du, wie die nullte, erste, zweite,... Spalte heißen soll?

            Hi Sven,

            was mir fehlt, ist ein konkretes Beispiel in der Doku zu str_getcsv().
            Normalerweise ist sowas immer dabei, hier aber nicht.

            Wie definiert man das denn?

            Kai

            1. Moin!

              Moin!

              $array = str_getcsv ($filename,"|","'","\");

              Ich hatte jetzt ein assoziatives Array erwartet.

              Und wo definierst du, wie die nullte, erste, zweite,... Spalte heißen soll?

              Hi Sven,

              was mir fehlt, ist ein konkretes Beispiel in der Doku zu str_getcsv().
              Normalerweise ist sowas immer dabei, hier aber nicht.

              Wie definiert man das denn?

              Das ist der Punkt: Du erwartest irgendwie Feldnamen, gibst sie aber nirgends an - wo sollen die herkommen?

              Antwort: Nirgendwo kommen die her. Feldnamen sind nicht vorgesehen, die wären nur in Ausnahmefällen in der ersten Zeile einer CSV-Datei enthalten und müssten dann manuell vom Programm an alle späteren Zeilenverarbeitungen durchgereicht werden. str_getcsv() bietet dazu keine Möglichkeit.

              - Sven Rautenberg

              1. Ok. Danke.
                Hab es jetzt.

                  
                $handle = fopen ("test.csv","r");  
                while ( ($data = fgetcsv ($handle, 4000, "|","'")) !== FALSE ) {  
                $array[]=$data;  
                }  
                fclose ($handle);  
                
                

                ergibt ein numerisch indiziertes Array. Damit komme ich dann klar.

                Kai

        2. Hallo,

          $filename = 'test.csv';

          $array = str_getcsv ($filename,"|","'","\");

          echo("<pre>");
          print_r($array);
          echo("<pre>");
          exit;

          
          >   
          > ergibt  
          >   
          > Array  
          > (  
          >     [0] => test.csv  
          > )  
          >   
          > Ich hatte jetzt ein assoziatives Array erwartet.  
            
          warum das, wenn du doch einfach nur den String "test.csv" parsen lässt? - Abgesehen davon gilt, was auch Sven andeutet: Wenn du nur \_einen\_ String als CSV parsen lässt (also \_einen\_ Datensatz), wo sollen da Feldnamen herkommen, die eventuell ein assoziatives Array ausmachen könnten?  
          Nein, stattdessen bekommst du "nur" ein numerisch indiziertes Array. In deinem Fall mit nur einem Element, da der von dir definierte Feld-Delimiter '|' nicht vorkommt.  
            
          Ciao,  
           Martin  
          
          -- 
          Kleine Geschenke erhalten die Freundschaft.  
          Große verderben sie aber meist auch nicht.  
          Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(