2011-07-11 169 views
2

我有一個基本上是.dat的文件;分隔文件,我試圖將其轉換爲製表符分隔.txt。我不確定的問題是,新文件的每一行都是原始文件行的3個組合,每個原始行都有不同數量的數據。第一列只是標識分組中的每一行。什麼是最好的方法來做到這一點?解析一個.dat文件

樣品原始數據:

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 

任何想法?

+0

想法:使用一個數據庫來存儲結構化數據。 –

回答

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"; 
} 
+0

正是我需要的。謝謝。 – bmbaeb

0

應該是這樣的

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

我會親自引爆數據則排的foreach所得數組中,然後再爆炸每條線在你的分隔符「;」然後格式化製表符分隔的輸出。

<?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.