web-dev-qa-db-fra.com

PHP Chaîne CSV à array

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.

35
Tomzie

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.

94
saran banerjee

Oneliner pratique:

$csv = array_map('str_getcsv', file('data.csv'));
34
Gaui

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.

18
iateadonut

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/

6
Rajen K Bhagat

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);
}
1
user

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));
0
codekaizer

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'));
0
Ramsés Fernández

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
}
0
Stacey Richards