J'essaie d'analyser une chaîne CSV dans un tableau en PHP. La chaîne CSV a les attributs suivants:
Delimiter: ,
Enclosure: "
New line: \r\n
Exemple de contenu:
"12345","Computers","Acer","4","Varta","5.93","1","0.04","27-05-2013"
"12346","Computers","Acer","5","Decra","5.94","1","0.04","27-05-2013"
Quand j'essaye de l'analyser comme ceci:
$url = "http://www.url-to-feed.com";
$csv = file_get_contents($url);
$data = str_getcsv($csv);
var_dump($data);
Le dernier et le premier élément sont concaténés dans une chaîne:
[0]=> string(5) "12345"
...
[7]=> string(4) "0.04"
[8]=> string(19) "27-05-2013
"12346""
Comment puis-je réparer cela? Toute aide serait appréciée.
Faire ceci:
$csvData = file_get_contents($fileName);
$lines = explode(PHP_EOL, $csvData);
$array = array();
foreach ($lines as $line) {
$array[] = str_getcsv($line);
}
print_r($array);
Cela vous donnera un résultat comme ceci:
Array
(
[0] => Array
(
[0] => 12345
[1] => Computers
[2] => Acer
[3] => 4
[4] => Varta
[5] => 5.93
[6] => 1
[7] => 0.04
[8] => 27-05-2013
)
[1] => Array
(
[0] => 12346
[1] => Computers
[2] => Acer
[3] => 5
[4] => Decra
[5] => 5.94
[6] => 1
[7] => 0.04
[8] => 27-05-2013
)
)
J'espère que cela peut être utile.
Oneliner pratique:
$csv = array_map('str_getcsv', file('data.csv'));
Vous devriez utiliser fgetcsv. Étant donné que vous ne pouvez pas importer un fichier sous forme de flux car le fichier csv est une variable, vous devez usurper la chaîne en tant que fichier en utilisant d'abord php://temp
ou php://memory
:
$fp = fopen("php://temp", 'r+');
fputs($fp, $csvText);
rewind($fp);
Vous n'aurez alors aucun problème à utiliser fgetcsv:
$csv = [];
while ( ($data = fgetcsv($fp) ) !== FALSE ) {
$csv[] = $data;
}
$data
sera un tableau d'une seule ligne csv (pouvant inclure des sauts de ligne, des virgules, etc.), comme il se doit.
J'ai utilisé la fonction suivante pour analyser la chaîne csv dans un tableau associatif
public function csvToArray($file) {
$rows = array();
$headers = array();
if (file_exists($file) && is_readable($file)) {
$handle = fopen($file, 'r');
while (!feof($handle)) {
$row = fgetcsv($handle, 10240, ',', '"');
if (empty($headers))
$headers = $row;
else if (is_array($row)) {
array_splice($row, count($headers));
$rows[] = array_combine($headers, $row);
}
}
fclose($handle);
} else {
throw new Exception($file . ' doesn`t exist or is not readable.');
}
return $rows;
}
si votre nom de fichier csv est mycsv.csv, vous appelez cette fonction comme suit:
$dataArray = csvToArray(mycsv.csv);
vous pouvez également obtenir ce script dans http://www.scriptville.in/parse-csv-data-to-array/
Version légèrement plus courte, sans seconde variable inutile:
$csv = <<<'ENDLIST'
"12345","Computers","Acer","4","Varta","5.93","1","0.04","27-05-2013"
"12346","Computers","Acer","5","Decra","5.94","1","0.04","27-05-2013"
ENDLIST;
$arr = explode("\n", $csv);
foreach ($arr as &$line) {
$line = str_getcsv($line);
}
Une modification des réponses précédentes en utilisant array_map
.
Faites exploser les données CSV avec plusieurs lignes.
$csv = array_map('str_getcsv', explode("\n", $csvData));
Si vous avez besoin d’un nom pour les colonnes csv, vous pouvez utiliser cette méthode.
$example= array_map(function($v) {$column = str_getcsv($v, ";");return array("foo" => $column[0],"bar" => $column[1]);},file('file.csv'));
Si vous avez des retours à la ligne/des sauts de ligne dans les colonnes, str_getcsv ne fonctionnera pas.
Essayez https://github.com/synappnz/php-csv
Utilisation:
include "csv.php";
$csv = new csv(file_get_contents("filename.csv"));
$rows = $csv->rows();
foreach ($rows as $row)
{
// do something with $row
}