web-dev-qa-db-fra.com

php fgetcsv renvoyant toutes les lignes

J'ai le fichier csv suivant:

upc/ean/isbn,item name,category,supplier id,cost price,unit price,tax 1 name,tax 1 percent,tax 2 name,tax 2 percent,quantity,reorder level,description,allow alt. description,item has serial number
,Apple iMac,Computers,,10,12,8,8,10,10,10,1,Best computer,,
,Apple iMac,Computers,,10,12,8,8,10,10,10,1,Best computer,,
,Apple iMac,Computers,,10,12,8,8,10,10,10,1,Best computer,,
,Apple iMac,Computers,,10,12,8,8,10,10,10,1,Best computer,,
,Apple iMac,Computers,,10,12,8,8,10,10,10,1,Best computer,,
,Apple iMac,Computers,,10,12,8,8,10,10,10,1,Best computer,,
,Apple iMac,Computers,,10,12,8,8,10,10,10,1,Best computer,,
,Apple iMac,Computers,,10,12,8,8,10,10,10,1,Best computer,,
,Apple iMac,Computers,,10,12,8,8,10,10,10,1,Best computer,,
,Apple iMac,Computers,,10,12,8,8,10,10,10,1,Best computer,,
,Apple iMac,Computers,,10,12,8,8,10,10,10,1,Best computer,,
,Apple iMac,Computers,,10,12,8,8,10,10,10,1,Best computer,,

Quand je fais ça:

if (($handle = fopen($_FILES['file_path']['tmp_name'], "r")) !== FALSE) 
{
    $data = fgetcsv($handle);
    var_dump($data);
}

Je reçois un tableau avec 183 éléments, je m'attendrais à ne recevoir qu'une seule ligne du csv, mais le fichier entier.

J'ai même essayé $data = fgetcsv($handle, 1000); et j'ai eu le même résultat

36
Chris Muench

C'est probablement un problème de fin de ligne. Essayez d'activer auto_detect_line_endings qui tentera de déterminer les fins de ligne du fichier.

ini_set('auto_detect_line_endings', true);

Si cela ne résout pas le problème, alors detect le type de fin de ligne à l'aide de la commande file :

$ file example.csv
example.csv: ASCII text, with CR line terminators

Vous pouvez ensuite convertir les fins de ligne. Je ne suis pas sûr du système d'exploitation que vous utilisez, mais il existe de nombreux utilitaires pour la conversion de format de fichier , par exemple. dos2unix .

102
mholzmann

C’est la solution la plus courte à laquelle je puisse penser:

$fp = fopen('test.csv', 'r');

// get the first (header) line
$header = fgetcsv($fp);

// get the rest of the rows
$data = array();
while ($row = fgetcsv($fp)) {
  $arr = array();
  foreach ($header as $i => $col)
    $arr[$col] = $row[$i];
  $data[] = $arr;
}

print_r($data);

Sortie:

Array
(
    [0] => Array
        (
            [upc/ean/isbn] => 
            [item name] => Apple iMac
            [category] => Computers
            [supplier id] => 
            [cost price] => 10
            [unit price] => 12
            [tax 1 name] => 8
            [tax 1 percent] => 8
            [tax 2 name] => 10
            [tax 2 percent] => 10
            [quantity] => 10
            [reorder level] => 1
            [description] => Best computer
            [allow alt. description] => 
            [item has serial number] => 
        )

    [1] => Array
        (
            [upc/ean/isbn] => 
            [item name] => Apple iMac
            [category] => Computers
            [supplier id] => 
            [cost price] => 10
            [unit price] => 12
            [tax 1 name] => 8
            [tax 1 percent] => 8
            [tax 2 name] => 10
            [tax 2 percent] => 10
            [quantity] => 10
            [reorder level] => 1
            [description] => Best computer
            [allow alt. description] => 
            [item has serial number] => 
        )

    // ...

    [11] => Array
        (
            [upc/ean/isbn] => 
            [item name] => Apple iMac
            [category] => Computers
            [supplier id] => 
            [cost price] => 10
            [unit price] => 12
            [tax 1 name] => 8
            [tax 1 percent] => 8
            [tax 2 name] => 10
            [tax 2 percent] => 10
            [quantity] => 10
            [reorder level] => 1
            [description] => Best computer
            [allow alt. description] => 
            [item has serial number] => 
        )

)
4
Czechnology

essayer:

 while (($data = fgetcsv($handle, 0, ',')) !== FALSE) {
    $columns = count($data);
 }

Sinon, vous pouvez essayer d'utiliser str_getcsv(file_get_contents(...))

1
Martin

Vous avez le même problème, sur un Mac, avec un fichier CSV généré par Microsoft Excel. J'ai exécuté la commande more sur différents fichiers et il semble que la fin de la ligne soit différente.

$ more Excel.csv && more test.csv
[email protected]^[email protected]^[email protected]^M
[email protected]
[email protected]
[email protected]

J'ai utilisé

ini_set('auto_detect_line_endings', true);

avant

fgetcsv($handle, 0, ';')

et il fonctionne. La réponse acceptée est correcte.

1
Arnaud Schneider

Pour lire tout le fichier CSV en une fois, utilisez:

$data = array_map("str_getcsv", file($fn));
var_dump($data);

Bien que vous deviez array_shift () la première ligne (si vous n'utilisez pas les clés de colonne). 


La solution de contournement pour les fins de ligne non spécifiques:

$data = array_map("str_getcsv", preg_split('/[\r\n]+/', file_get_contents($fn)));
var_dump($data);
0
mario

Si vous avez l'option, revenez en arrière dans votre fichier .csv pour inclure les fins de ligne de style "Unix" ... alors fgetcsv coupera automatiquement le tableau en fin de ligne.

0
Dr Nick Engerer