2013-07-20 4 views
26

J'essaye d'analyser une chaîne CSV en un tableau en PHP. La chaîne CSV possède les attributs suivants:PHP CSV string to array

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" 

Lorsque je tente 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 élément et le premier sont concaténés dans un chaîne:

[0]=> string(5) "12345" 
... 
[7]=> string(4) "0.04" 
[8]=> string(19) "27-05-2013 
"12346"" 

Comment puis-je résoudre ce problème? Toute aide serait appréciée.

+1

'[2] => string (48) "Acer"', 'Acer' est certainement pas 48 caractères de long. Vous voudrez peut-être inspecter votre entrée si elle est vraiment dans le bon format. –

+1

J'ai édité le contenu pour des raisons de confidentialité, merci pour la remarque. – Tomzie

Répondre

83

Faites ceci:

$csvData = file_get_contents($fileName); 
$lines = explode(PHP_EOL, $csvData); 
$array = array(); 
foreach ($lines as $line) { 
    $array[] = str_getcsv($line); 
} 
print_r($array); 

Il vous donnera une sortie 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 un peu d'aide.

+0

A travaillé comme un charme! Merci beaucoup. – Tomzie

+2

Je suis légitimement curieux, mais y a-t-il une raison pour que ce soit mieux que la simple solution d'une ligne de Gaui ci-dessous, ou est-ce que les gens sont juste en train d'augmenter cela parce que c'est la réponse choisie? – Mike

+0

Merci, cela fonctionne aussi quand mon fichier CSV a contenu avec la virgule "Martin T", et une double citation comme => Philipp "Heinzelmann" –

5

J'ai utilisé la fonction suivante pour analyser la chaîne csv si votre nom de fichier csv 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; 
} 

est mycsv.csv alors vous appelez cette fonction:

$dataArray = csvToArray(mycsv.csv); 

vous pouvez obtenir ce script aussi dans http://www.scriptville.in/parse-csv-data-to-array/

+1

C'est la meilleure solution jusqu'à présent! Depuis que je suis en utilisant Excel CSV, j'ai changé cette ligne '$ row = fgetcsv ($ handle, 10240, '', '"'), ' à ' $ row = fgetcsv ($ handle , 10240, ';', '"');' –

0

Version légèrement plus courte, sans deuxième 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); 
} 
+3

Echoue pour les champs multilignes. –

34

oneliner Handy:

$csv = array_map('str_getcsv', file('data.csv')); 
+12

$ mind = 'soufflé'; – JohnnyFaldo

+7

Echoue pour les champs CSV multilignes, n'est-ce pas? –

+0

Oui probablement, car file() le confondrait avec une nouvelle ligne CSV. – Gaui

10

Vous devez utiliser fgetcsv. Puisque vous ne pouvez pas importer un fichier en tant que flux parce que le csv est une variable, vous devez alors usurper la chaîne comme un fichier en utilisant php://temp ou php://memory premier:

$fp = fopen("php://temp", 'r+'); 
fputs($fp, $csvText); 
rewind($fp); 

Ensuite, vous aurez aucun problème à l'aide fgetcsv:

$csv = []; 
while (($data = fgetcsv($fp)) !== FALSE) { 
    $csv[] = $data; 
} 

$data sera un tableau d'une seule ligne de csv (qui peut inclure des sauts de ligne ou des virgules, etc.), comme cela devrait être.

+4

Ceci est l'une des rares réponses qui gère correctement les nouvelles lignes à l'intérieur des champs .. il devrait y avoir beaucoup plus de votes upvotes. –

+0

Merci! Je suis frustré par les autres réponses aussi! – iateadonut

+1

C'est le meilleur moyen! N'utilisez pas 'fichier ('data.csv')' ou 'explode (PHP_EOL, $ csv)' car ils n'analysent pas correctement les sauts de ligne dans les chaînes csv! – Modder

0

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'));