2016-08-04 78 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