2016-08-04 94 views
0

我試圖將一些製表符分隔的數據轉換爲我可以使用的更好的格式。 JSON會很棒。製表符分隔的數據到JSON

數據例子是在這裏:http://www.nlaa.ca/results/rr/2013/20130728tely10results.php

我已經下載了全部數據,並每年在它自己的文本文件。從那裏,我將它們拼湊起來,並將它們運行成爲一個foreach並逐行閱讀它們。像這樣:

// Grab all the .txt files 
foreach (glob('src-data/*.txt') as $filename) { 
    $handle = fopen($filename, 'r'); 
    if ($handle) { 
     // run line by line through the files 
     while (($line = fgets($handle)) !== false) { 
      // grab the fields 
      $clean = preg_split("/ +/", $line); 

從這裏,我希望把所有的線在一個巨大的關聯數組:

  // All the fields 
      $position = $clean[1]; 
      $name = $clean[3] . " " . $clean[4]; 
      $time = $clean[5]; 
      $class = $clean[6]; 
      $class_place = $clean[7]; 


      $runners['position'] = $position; 
      $runners['name'] = $name; 
      $runners['time'] = $time; 
      $runners['class'] = $class; 
      $runners['class place'] = $class_place; 

這八九不離十工作,但它僅創建每個.txt文件的一個數組我有。

當我做print_r($runners);我得到兩個數組 - 一個用於我在該目錄中的兩個示例.txt文件中的每一個。

我想將每個新行都推送到我的$runners[]數組中,因爲我循環它。

我在這裏的最終目標是創建一個大JSON文件,我可以在路上使用Js。我認爲只要運行json_encode($runners)就可以工作,如果我能得到$runners的工作,但感謝任何建議。謝謝!

下面是完整的代碼,我使用的,只是要確定:

<?php 


$runners = []; 

// Grab all the .txt files 
foreach (glob('src-data/*.txt') as $filename) { 
    $handle = fopen($filename, 'r'); 

    if ($handle) { 
     // run line by line through the files 
     while (($line = fgets($handle)) !== false) { 
      // grab the fields 
      $clean = preg_split("/ +/", $line); 

      // All the fields 
      $position = $clean[1]; 
      $name = $clean[3] . " " . $clean[4]; 
      $time = $clean[5]; 
      $class = $clean[6]; 
      $class_place = $clean[7]; 


      $runners['position'] = $position; 
      $runners['name'] = $name; 
      $runners['time'] = $time; 
      $runners['class'] = $class; 
      $runners['class place'] = $class_place; 

      $runners[] = $clean; 


     } 
     print_r($runners); 

     // write to json file 
     $jsonwrite = fopen('runners.json', 'w'); 
     fwrite($jsonwrite, json_encode($runners)); 
     fclose($jsonwrite); 

     fclose($handle); 
    } else { 
     echo "Error opening file"; 
    } 
} 



?> 
+0

爲什麼不使用fgetcsv()代替手動解析原始數據行?您可以非常輕鬆地自定義分隔符。 –

+0

謝謝馬克 - 我給了這個快速嘗試,但似乎並沒有太多。所有列在它們之間具有不同數量的空格。也許fgetcsv()可以以某種方式處理。我會谷歌!謝謝 – saltcod

回答

1

替換:

$runners['position'] = $position; 
$runners['name'] = $name; 
$runners['time'] = $time; 
$runners['class'] = $class; 
$runners['class place'] = $class_place; 

$runners[] = $clean; 

有了:

$runners[] = [ 
    'position' => $position, 
    'name' => $name, 
    'time' => $time, 
    'class' => $class, 
    'class_place' => $class_place 
]; 

,你會得到類似的信息(僞數據):

array(
    [0] => array(
     'position' => 1, 
     'name' => 'Hans Muster', 
     'time' => '05:18', 
     'class' => '1A', 
     'class_place' => '2' 
    ), 
    [1] => array(
     'position' => 4, 
     'name' => 'Franz Muster', 
     'time' => '08:12', 
     'class' => '1A', 
     'class_place' => '7' 
    ) 
) 
+0

肯定沒有得到!非常感謝! – saltcod

1

你不是「推」到陣列上的。你只是有一個數組,你不斷覆蓋一些成員值。你應該有更多的東西一樣:

$arr = array(); 
foreach(... list of files ...) { 
    $fh = fopen($file, 'r'); 
    while ($row = fgetcsv($fh, .... options ...)) { 
     ... process $row ... 
     $arr[] = $row; 
    } 
    fclose($fh); 
} 

注意[] - 這是「推」操作。

+0

非常正確。剛看了一下'推'實際上意味着什麼。謝謝! – saltcod

相關問題