2015-04-11 2 views
3

Je suis l'importation d'un csv en utilisant php et depuis le csv peut parfois être grand, je le fais en streaming le fichier 4096 octets à la fois avec le code suivant:PHP fgetcsv et une ligne personnalisée de fin caractère

if(($handle = fopen($file, 'r')) !== false) 
    { 
     // loop through the file line-by-line 
     while(($data = fgetcsv($handle)) !== false) 
     { 
      echo var_dump($data); 
      unset($data); 
     } 
     fclose($handle); 
    } 
    else 
    { 
     echo "unable to open file $file <br>"; 
    } 

Certains des csv ont un caractère de fin de ligne non standard ';' et je dois être en mesure de préciser la fin de ligne manuellement afin que fgetcsv devient correctement chaque ligne du csv.

J'ai lu d'autres solutions qui suggèrent à l'aide du paramètre ini:

ini_set("auto_detect_line_endings", true); 

Mais cela n'a pas résolu le problème que je reçois ici.

Une solution précédente à ce problème est d'obtenir le fichier entier et modifier toutes les fins de ligne non standard et les remplacer par retour chariot et à la ligne. Cette solution n'est plus valide car la taille de csvs a augmenté. Ce que j'obtiens dans le vidage de var est toutes les lignes du csv au lieu d'une seule ligne du csv. ligne Exemple de CSV:

"col1,col2,col3,col4,col5;col1,col2,col3,col4,col5;col1,col2,col3,col4,col5;" 
+0

S'il vous plaît montrer un petit exemple comment votre fichier csv ressemble – Rizier123

Répondre

4

Depuis fgetcsv() n'a pas de possibilité de changer la fin de la ligne, vous pouvez encore lire le fichier avec stream_get_line() jusqu'au délimiteur, puis analyser la ligne avec str_getcsv()

// Given a delimiter... 
$delimiter = ";"; 

if(($handle = fopen($file, 'r')) !== false) { 
    // Read the line up to the delimiter 
    while ($line = stream_get_line($handle, 4096, $delimiter)) { 
    // Parse the CSV line into an array 
    $data = str_getcsv($line); 
    var_dump($data); 
    } 
    fclose($handle); 
} 
+0

Cela fonctionne très bien pour la solution. Étant donné que stream_get_line et str_getcsv travaillent sur le fichier avec une longueur d'entrée limitée, je peux voir comment cette solution va continuer à fonctionner même avec des fichiers plus gros comme prévu. Merci de votre aide! – KenEucker

+0

@ KenEucker Content de vous aider, bonne chance. 'stream_get_line()' fonctionne exactement de la même manière que 'fgets()' (sur lequel 'fgetcsv()' est basé), donc oui, ça devrait marcher avec les gros fichiers. –