2015-01-23 14 views
14

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

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 alle Daten zu sehen (s)

Dann json_encode($result); ich und versuchte, es zu zeigen, aber nichts auf dem Bildschirm angezeigt alle. Alles, was ich sehe, ist der leere Bildschirm und 0 Fehlermeldung.

Mache ich etwas falsch? Kann mir jemand helfen ?

addierte Ergebnis von 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 .... 
+0

Bitte posten Sie die Ausgabe, wenn Ihre 'print_r ($ Ergebnis);' – Rizier123

+0

Will - geben Sie mir eine 1 Mn – iori

+0

Ich gebe dir 2min: D – Rizier123

Antwort

46

wie diese versuchen:

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

Was ist 'str_getcsv'? Wow - Sie konvertieren das Ganze in nur 5 Zeilen Code. Beeindruckend! – iori

+1

Ich muss versuchen, Ihre Lösung – iori

+1

Funktion str_getcsv CSV-String in ein Array zu parsen. http://php.net/str_getcsv – Whirlwind

-1

Sie können überprüfen, um zu sehen, ob es ein Fehler mit json_last_error() während JSON-Codierung war. Könnten Sie das bitte zuerst versuchen?

+0

Ich benutze es Ich führe es, und ich habe' 5' – iori

+0

5 = JSON_ERROR_UTF8 Dies bedeutet, dass ein Fehler bei der Codierung Ihrer Eingabe ist. Versuchen Sie, utf8_enocde() für Ihre Datenzeichenfolge zu verwenden, bevor Sie sie zum Array hinzufügen. – SArnab

+0

Wissen Sie, wie Sie es beheben können? – iori

2

Ich stieß auf ein ähnliches Problem, ich benutze dies um rekursiv die Daten in UTF-8 auf einem Array vor der Codierung zu JSON zu konvertieren.

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/

2

Sie auch auf diese Weise 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; 
1

Wenn Sie eine dynamische CSV-Datei konvertieren, können Sie die URL durch einen Parameter übergeben (url=http://example.com/some.csv), und es wird Ihnen die meisten up-to-date-Version:

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

Daten .csv

Spiel, Fähigkeit
Schatzjäger, Pilipala
Raketenwerfer, bibobibo
Rocket Engine, hehehohoho

Um mit Spaltenname zu konvertieren, ist dies, wie ich es mache.

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" 
    } 
] 
0

Alternative Lösung, die als @ Whirlwind-Lösung ähnliche Methode verwendet, liefert aber einen Standard JSON Ergebnis (mit dem Namen Felder für jedes Objekt/Datensatz):