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
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
.
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] =>
)
)
essayer:
while (($data = fgetcsv($handle, 0, ',')) !== FALSE) {
$columns = count($data);
}
Sinon, vous pouvez essayer d'utiliser str_getcsv(file_get_contents(...))
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.
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);
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.