【问题标题】:PHP Parsing a .dat filePHP解析.dat文件
【发布时间】:2011-07-11 22:00:14
【问题描述】:

我有一个 .dat 文件,它本质上是 ;分隔文件,我正在尝试将其转换为制表符分隔的 .txt。我不确定的问题是新文件的每一行将是原始文件的 3 行的组合,每个原始行都有不同数量的数据。第一列仅标识分组中的每一行。最好的方法是什么?

原始数据示例:

01;zxc;asd;qwe;uio;jkl;asd;123;456
02;lkj;oiu;oji
03;fjifao;vbofekjf;fjieofk;aoijf;voien3984
01;lkj;oiu;fji;eoj;vnk;fji;098;321
02;fji;oje;jvi
03;jie;voi;djv;eojf;38723

结束输出:

zxc   asd   qwe   uio   jkl   asd   123   456   lkj   oiu   oji   fjifao   vbofekjf   fjieofk   aoijf   voien3984
lkj   oiu   fji   eoj   vnk   fji   098   321   fji   oje   jvi   jie   voi   djv   eojf   38723

有什么想法吗?

【问题讨论】:

  • 理念:使用数据库存储结构化数据。

标签: php csv tabs fgetcsv


【解决方案1】:

我会这样做:

$lines = file($data);
$rows = array();
$row_pivot = -1;
foreach ($lines as $line) {

    // Split line by ;
    $data = explode(';', trim($line));

    // Get the first element
    $r_id = array_shift($data);
    if ($r_id == '01') {
        // When 01 is the first element, start a new row
        // You can dump the previous row here as well if you aim for speed
        $row_pivot++;
        $rows[$row_pivot] = array();
    }

    // Add data to row
    $rows[$row_pivot] = array_merge($rows[$row_pivot], $data);
}

// Print rows
foreach ($rows as $r) {
    echo implode("\t", $r)."\n";
}

【讨论】:

  • 正是我需要的。谢谢。
【解决方案2】:

我会亲自分解数据,然后对结果数组中的每一行进行分解,然后在分隔符 ';' 处再次分解每一行然后格式化一个制表符分隔的输出。

<?php

$data = 'LOADED FILE DATA';
$lines = preg_split( '/\r\n|\r|\n/', $data);
$out = '';

foreach($lines as $line){
    $parts = explode(';',$line);
    foreach($parts as $part){
        $out .= $part.'\t';
    }
    $out .= '\n';
}

echo $out;

?>

code untested.

【讨论】:

    【解决方案3】:

    应该是这样的

    $lines = file($filename);
    $lineCount = count($lines);
    $output = '';
    for ($i = 0; $i < $lineCount - 2; $i += 3) {
      $newLines = array();
      for ($j = $i; $j < $i + 3; $j++) {
        list($_, $rest) = explode(';', isset($lines[$j]) ? $lines[$j] : '');
        $newLines = array_merge($newLines, $rest);
      }
    
      $output .= implode("\t", $newLines) . "\n";
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多