PHP синтаксический анализ файла .dat - PullRequest
2 голосов
/ 12 июля 2011

У меня есть файл .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

Есть идеи?

Ответы [ 3 ]

1 голос
/ 12 июля 2011

Вот как бы я это сделал:

$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";
}
0 голосов
/ 12 июля 2011

Я бы лично взорвал данные, затем перед каждой строкой в ​​результирующем массиве, а затем снова взорвал каждую строку в вашем разделителе ';'а затем отформатируйте вывод с разделителями табуляции.

<?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.
0 голосов
/ 12 июля 2011

Должно быть что-то вроде этого

$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";
}
...