У меня есть .dat файл, который по существу; и я пытаюсь преобразовать его в файл с разделителями с табуляцией. Проблема, о которой я не уверен, заключается в том, что каждая строка нового файла будет представлять собой комбинацию из 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
Есть идеи?
Вот как я это сделаю:
$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"; }
Я бы лично взорвал данные, затем запустил строку в результирующем массиве, а затем снова взорвал каждую строку на вашем разделителе ';' а затем отформатируйте вывод с разделителем табуляции.
<?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.
Должно быть что-то вроде этого
$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"; }