webentwicklung-frage-antwort-db.com.de

Konvertieren Sie CSV in JSON mit PHP

Ich versuche, CSV-Datei mit PHP in JSON zu konvertieren.

Hier ist mein 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); // Ich sehe alle Daten 

Dann habe ich json_encode($result); und versucht, es anzuzeigen, aber auf dem Bildschirm wird überhaupt nichts angezeigt. Alles was ich sehe ist der leere Bildschirm und 0 Fehlermeldung. 

Mache ich etwas falsch? Kann mir jemand helfen ? 

Ergebnis von print_r($result); hinzugefügt

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

Versuchen Sie es so:

$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

Sie können diesen Weg auch versuchen. 

  <?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

Ich stieß auf ein ähnliches Problem. Letztendlich wandelte ich die Daten rekursiv in UTF-8 in einem Array um, bevor sie in JSON codiert wurden.

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;
} 

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

4
Samwise

Wenn Sie eine dynamische CSV-Datei konvertieren, können Sie die URL durch einen Parameter (url=http://example.com/some.csv) übergeben, der die aktuellste Version anzeigt:

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

Alternative Lösung, die eine ähnliche Methode wie die Lösung von @ Whirlwind verwendet, jedoch ein Standard-JSON-Ergebnis zurückgibt (mit benannten Feldern für jedes Objekt/Datensatz):

// 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

Spiel, Geschicklichkeit
Schatzsucher, Pilipala
Raketenwerfer, bibobibo
Raketenmotor, hehehohoho

Um mit Spaltennamen zu konvertieren, mache ich das so.

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

Das Ausgabeergebnis

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

Ich mochte @ ian-d-millers Lösung für die Konvertierung der Daten in ein Schlüssel-/Wertformat, stieß aber immer wieder auf Probleme mit seinem Code.

Folgendes hat bei mir funktioniert:

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;
}

Verwendungszweck:

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

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

Die akzeptierte Antwort verwendet file_get_contents(), um die gesamte Datei als String im Speicher zu lesen, und dann explode(), um sie zu einem Array zu machen.

Es kann jedoch schneller gemacht werden, kleiner im Speicher und nützlicher sein:

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: Ich habe hier JSON_NUMERIC_CHECK verwendet, um zu vermeiden, dass Zahlen in Strings gesetzt werden. Es reduziert auch die Ausgabegröße und hilft normalerweise Javascript auf der anderen Seite (z. B. zum Berechnen oder Plotten der Daten). Vorsicht vor Telefonnummern!

0
MoonCactus