2010-07-01 4 views
0

Je travaille avec un fichier CSV et PHP5 mais je ne comprends pas très bien ce que je vois. Le fichier est la suivante quand je l'ouvre dans un éditeur de texte:Fgetcsv lecture de ligne initiale

"Jun 23,2010 21:40","City1","Location1","0 0 0 " 
"Jun 23,2010 21:41","City2","Location1","0 0 0 " 

Ce que je reçois en sortie de ce code:

while (($data = fgetcsv($handle, 1000, ",","\"")) !== FALSE) { 
     $num = count($data); 
echo "<p> $num fields in line $row: <br /></p>\n"; 
$row++; 
for ($c=0; $c < $num; $c++) { 
    echo $data[$c] . "<br />\n"; 
} 
} 
fclose($handle); 

Est-ce sortie:

5 fields in line 1: 
"Jun 23 
2010 21:40" 
City1 
Location1 
0 0 0 

4 fields in line 2: 
Jun 23,2010 21:41 
City2 
Location1 
0 0 0 

Comme vous pouvez le voir, sur la première ligne, fgetcsv saute le caractère de l'enceinte et lit la virgule comme le premier champ, alors que le second li ne lit correctement et ainsi de suite toutes les lignes.

Donc, est-ce que je manque quelque chose ou est-ce un bug, et si c'est un bug, quelles seraient les solutions possibles autres que la réécriture du fichier original?

Répondre

1

Votre code (complet):

<? 
$handle = fopen('test.csv', "r"); 
while (($data = fgetcsv($handle, 1000, ",","\"")) !== FALSE) { 
    $num = count($data); 
echo "<p> $num fields in line $row: <br /></p>\n"; 
$row++; 
for ($c=0; $c < $num; $c++) { 
     echo $data[$c] . "<br />\n"; 
} 
} 
fclose($handle); 
?> 

Parse les données ci-dessus correctement posté:

taifun: Test killerx $ php test.php

4 champs en ligne:

Jun 23,2010 21:40
Ville1
Location1

4 champs dans la ligne 1:

juin 23,2010 21:41
City2
Location1

Peut-être que vous avez un signe "malencontreusement". comme "" ou "ou ˝. Ils peuvent ressembler, mais ne sont pas la même chose que ».

+0

après avoir vérifié autour du code, je pense que vous avez raison et quelque chose dans le fichier réel pourrait être foiré le fgetcsv.J'ai copié et collé le fichier entier dans un éditeur de texte à un nouveau fichier, a couru cela et pas de problèmes. Le fichier est en train d'être écrit par un script iMacoros et, d'une manière ou d'une autre, il bousille le format au niveau binaire car dans le texte ils ont l'air identiques. – ruskiar

+0

Dug autour un peu plus et il s'avère que fgetcsv n'aime pas l'encodage UTF-8, donc après une petite conversion de fichier, tout fonctionne comme un charme. – ruskiar

0

J'ai eu le même problème. Il est venu de l'encodage. je converti le fichier CSV dans « UTF-8 sans BOM » et il a été résolu.

0

Je trouve cela se produit si le fichier est UFT8 codé et contient la nomenclature Une façon simple contourner ce problème est de transmettre le pointeur de fichier par 3 octets après l'ouverture, puis commencer à aller chercher des lignes pour CSV.

$f = fopen('file.csv', 'r'); 
fread($f, 3); 
while(($line = fgetcsv($f)) { 
    // do some stuff 
}