2013-06-13 8 views
1

Je dispose d'un fichier CSV qui ressemble à:PHP convertir CSV au format spécifique JSON

Name, Id, Address, Place, 
John, 12, "12 mark street", "New York", 
Jane, 11, "11 bark street", "New York"... 

J'ai environ 500 coloumns. Je voudrais convertir en JSON, mais je veux la sortie pour ressembler à:

{ 
    "name": [ 
     "John", 
     "Jane" 
    ], 
    "Id": [ 
     12, 
     11 
    ], 
    "Address": [ 
     "12 mark street", 
     "12 bark street" 
    ], 
    "Place": [ 
     "New York", 
     "New York" 
    ] 
} 

En utilisant PHP, comment puis-je itérer le fichier CSV afin que je puisse faire de chaque colonne dans la première ligne un tableau détient les valeurs dans la même colonne sur toutes les autres lignes?

+0

Je 'utiliser file_get_contents' pour charger le CSV, puis' exploser ("", $ csvfile) 'puis manipuler le tableau jusqu'à ce que vous l'obteniez comme vous voulez et enfin' json_encode' il. –

+0

Boucle sur la liste, ajouter aux groupes '$ output [" nom "] [] = $ row [0];'. Montrez votre tentative actuelle si vous avez besoin de plus de conseils. – mario

Répondre

4

ce serait une méthode générique qui est valable pour tout amoutn de colums nommé. si elles sont statiques, il sera plus courte pour les adresser directement

<? 
$result = array(); 
if (($handle = fopen("file.csv", "r")) !== FALSE) { 
    $column_headers = fgetcsv($handle); // read the row. 
    foreach($column_headers as $header) { 
      $result[$header] = array(); 
    } 

    while (($data = fgetcsv($handle)) !== FALSE) { 
     $i = 0; 
     foreach($result as &$column) { 

       $column[] = $data[$i++]; 
     } 

    } 
    fclose($handle); 
} 
$json = json_encode($result); 
echo $json; 
0

Il existe quelques fonctions PHP utiles qui feront ce dont vous avez besoin.

Ouvrir fopen et analyser avec fgetcsv.

Une fois que vous avez votre tableau, utilisez * json_encode * pour l'amener au format JSON.

Quelque chose comme cela pourrait fonctionner (non testé):

$results = array(); 
$headers = array(); 

//some parts ripped from http://www.php.net/manual/en/function.fgetcsv.php 
if (($handle = fopen("test.csv", "r")) !== FALSE) { 
    $line = 0; 
    while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) { 
      for ($x=0; $x < count($data); $c++) { 
       if ($line == 0) { 
        $headers[] = $data[$x]; 
       } 
       $results[$x][] = $data[$x]; 
      } 
    } 
    fclose($handle); 
} 

$output = array(); 

$x = 0; 
foreach($headers as $header) { 
    $output[$header] = $results[$x++]; 
} 

json_encode($output); 
0

Solution compacte:

<?php 
$fp = fopen('file.csv', 'r'); 
$array = array_fill_keys(array_map('strtolower',fgetcsv($fp)), array()); 
while ($row = fgetcsv($fp)) { 
    foreach ($array as &$a) { 
     $a[] = array_shift($row); 
    } 
} 
$json = json_encode($array);