web-dev-qa-db-fra.com

Convertir du CSV au JSON en utilisant PHP

J'essaie de convertir un fichier CSV en JSON avec PHP.

Voici mon code

<?php 

date_default_timezone_set('UTC');
$today = date("n_j"); // Today is 1/23/2015 -> $today = 1_23

$file_name = $today.'.CSV'; // My file name is 1_23.csv
$file_path = 'C:\\Users\\bheng\\Desktop\\qb\\'.$file_name;
$file_handle = fopen($file_path, "r");

$result = array();

if ($file_handle !== FALSE) {

    $column_headers = fgetcsv($file_handle); 
    foreach($column_headers as $header) {
            $result[$header] = array();

    }
    while (($data = fgetcsv($file_handle)) !== FALSE) {
        $i = 0;
        foreach($result as &$column) {
                $column[] = $data[$i++];
        }
    }
    fclose($file_handle);
}

// print_r($result); // I see all data(s) except the header

$json = json_encode($result);
echo $json;

?>

print_r($result); // Je vois toutes les données 

Ensuite, j'ai json_encode($result); et essayé de l'afficher, mais rien ne s'affiche à l'écran. Tout ce que je vois est l'écran vide et le message d'erreur 0. 

Est-ce que je fais quelque chose de mal? Est-ce que quelqu'un peut m'aider ? 

Résultat ajouté de print_r($result);

Array (
    [Inventory] => Array (
        [0] => bs-0468R(20ug)
        [1] => bs-1338R(1ml)
        [2] => bs-1557G(no bsa)
        [3] => bs-3295R(no BSA)
        [4] => bs-0730R-Cy5"
        [5] => bs-3889R-PE-Cy7"
        [6] => 11033R
        [7] => 1554R-A647
        [8] => 4667
        [9] => ABIN731018
        [10] => Anti-DBNL protein 

        .... more .... 
20
iori

Essayez comme ça:

$file="1_23.csv";
$csv= file_get_contents($file);
$array = array_map("str_getcsv", explode("\n", $csv));
$json = json_encode($array);
print_r($json);
58
Whirlwind

Vous pouvez essayer de cette façon aussi. 

  <?php

function csvtojson($file,$delimiter)
{
    if (($handle = fopen($file, "r")) === false)
    {
            die("can't open the file.");
    }

    $csv_headers = fgetcsv($handle, 4000, $delimiter);
    $csv_json = array();

    while ($row = fgetcsv($handle, 4000, $delimiter))
    {
            $csv_json[] = array_combine($csv_headers, $row);
    }

    fclose($handle);
    return json_encode($csv_json);
}


$jsonresult = csvtojson("./doc.csv", ",");

echo $jsonresult;
5
Renjith VR

J'ai rencontré un problème similaire, j'ai fini par l'utiliser pour convertir de manière récursive les données au format UTF-8 sur un tableau avant le codage en JSON.

function utf8_converter($array)
{
    array_walk_recursive($array, function(&$item, $key){
        if(!mb_detect_encoding($item, 'utf-8', true)){
                $item = utf8_encode($item);
        }
    });

    return $array;
} 

De: http://nazcalabs.com/blog/convert-php-array-to-utf8-recursively/

4
Samwise

Si vous convertissez un fichier CSV dynamique, vous pouvez transmettre l'URL via un paramètre (url=http://example.com/some.csv). Celui-ci vous montrera la version la plus récente:

<?php

// Lets the browser and tools such as Postman know it's JSON
header( "Content-Type: application/json" );

// Get CSV source through the 'url' parameter
if ( isset( $_GET['url'] ) ) {
    $csv = explode( "\n", file_get_contents( $_GET['url'] ) );
    $index = str_getcsv( array_shift( $csv ) );
    $json = array_map(
        function ( $e ) use ( $index ) {
            return array_combine( $index, str_getcsv( $e ) );
        }, $csv
    );
}
else {
    $json = "Please set the path to your CSV by using the '?url=' query string.";
}

// Output JSON
echo json_encode( $json );
2

Solution alternative qui utilise une méthode similaire à celle de @ Whirlwind mais renvoie un résultat JSON plus standard (avec des champs nommés pour chaque objet/enregistrement):

// takes a string of CSV data and returns a JSON representing an array of objects (one object per row)
function convert_csv_to_json($csv_data){
    $flat_array = array_map("str_getcsv", explode("\n", $csv_data));

    // take the first array item to use for the final object's property labels
    $columns = $flat_array[0];

    for ($i=1; $i<count($flat_array)-1; $i++){
        foreach ($columns as $column_index => $column){
            $obj[$i]->$column = $flat_array[$i][$column_index];
        }
    }

    $json = json_encode($obj);
    return $json; // or just return $obj if that's a more useful return value
}
1
Ian Miller

data.csv

Jeu, compétence
Chasseur de trésors, pilipala
Lance-roquettes, bibobibo
Moteur de fusée, hehehohoho

Pour convertir avec le nom de la colonne, voici comment je le fais.

csv2json.php

<?php
if (($handle = fopen("data.csv", "r")) !== FALSE) {
    $csvs = [];
    while(! feof($handle)) {
       $csvs[] = fgetcsv($handle);
    }
    $datas = [];
    $column_names = [];
    foreach ($csvs[0] as $single_csv) {
        $column_names[] = $single_csv;
    }
    foreach ($csvs as $key => $csv) {
        if ($key === 0) {
            continue;
        }
        foreach ($column_names as $column_key => $column_name) {
            $datas[$key-1][$column_name] = $csv[$column_key];
        }
    }
    $json = json_encode($datas);
    fclose($handle);
    print_r($json);
}

Le résultat de la sortie

[
    {
        "Game": "Treasure Hunter",
        "Skill": "pilipala"
    },
    {
        "Game": "Rocket Launcher",
        "Skill": "bibobibo"
    },
    {
        "Game": "Rocket Engine",
        "Skill": "hehehohoho"
    }
]
1
Kevin Khew

J'aimais la solution de @ ian-d-miller pour convertir les données en un format de style clé/valeur, mais je continuais à rencontrer des problèmes avec son code.

Voici ce qui a fonctionné pour moi:

function convert_CSV_to_JSON($csv_data){

    // convert csv data to an array
    $data = array_map("str_getcsv", explode("\n", $csv_data));

    // use the first row as column headers
    $columns = $data[0];

    // create array to hold our converted data
    $json = [];

    // iterate through each row in the data
    foreach ($data as $row_index => $row_data) {

        // skip the first row, since it's the headers
        if($row_index === 0) continue;

        // make sure we establish each new row as an array
        $json[$row_index] = [];

        // iterate through each column in the row
        foreach ($row_data as $column_index => $column_value) {

            // get the key for each entry
            $label = $columns[$column_index];

            // add this column's value to this row's index / column's key
            $json[$row_index][$label] = $column_value;       
        }
    }

    // bam
    return $json;
}

Usage:

// as is
$json = convert_CSV_to_JSON($csv);

// encoded
$json = json_encode($json);
0
Justin Parks

La réponse acceptée utilise file_get_contents() pour lire le fichier entier sous forme de chaîne en mémoire, puis explode() pour en faire un tableau.

Mais cela peut être fait plus rapidement, plus petit en mémoire et plus utile:

function ReadCsv($fn)
{
    $lines= file($fn); // read file directly as an array of lines
    array_pop($lines); // you can remove the last empty line (if required)
    $json= json_encode(array_map("str_getcsv", $lines), JSON_NUMERIC_CHECK);
    print_r($json);
}

Nb: J'ai utilisé JSON_NUMERIC_CHECK ici pour éviter que les nombres soient cités deux fois en chaîne. Cela réduit également la taille de la sortie et aide généralement javascript de l'autre côté (par exemple, pour calculer ou tracer les données). Attention aux numéros de téléphone!

0
MoonCactus