2014-07-05 26 views
0

我有一個文本文件text.txt,日期排列如此。在PHP中重新格式化文本文件

name1 
2010-01-02 (i) 
2010-05-07 (i) 
2010-06-12 (i) 
name2 
2010-01-02 (i) 
2010-05-07 (i) 
2010-06-12 (i) 
name3 
2011-01-05 (i) 
2011-05-05 (i) 
2011-06-14 (i) 

我想將文件寫入到2列,如:

+---------------+-----+ 
| 2010-01-02 (i)|name1| 
| 2010-05-07 (i)|name1| 
| 2010-06-12 (i)|name1| 
| 2010-01-02 (i)|name2| 
| 2010-05-07 (i)|name2| 
| 2010-06-12 (i)|name2| 
| 2011-01-05 (i)|name3| 
| 2011-05-05 (i)|name3| 
| 2011-06-14 (i)|name3| 
+---------------+-----+ 

這個代碼不創建該文件的預期。

<?php 
$path = "text.txt"; 
$file = file($path); 
foreach($file as $value) 
{ 
    $name = ""; 
    // if (is found 
    if (strpos($value, "(") !== false) 
    { 
    $date = $value; 
    $line = $date . "|" . $name; 
    $val = explode("|",$line); 
    //write only 
    $fp = fopen('data.csv', 'w'); 
    fputcsv($fp, $val); 
    fclose($fp); 
    } 
    else 
    { 
    $name = $value; 
    //echo $name . "<br />"; 
    } 
} 
?> 
+0

根據你現在的代碼,你只寫出了名字......從來沒有。那個'別的'正在把你搞砸。我會爲你寫一個快速版本。 –

+0

輸出文件的外觀如何? –

+0

'「2011-06-14(i)」,' – rrrfusco

回答

1
$path = "text.txt"; 
$file = file($path); 

$fp = fopen('data.csv', 'w+'); 
$title = array_shift($file); 

foreach($file as $value) { 
    if (!strpos($value, "(")){ 
     $title = $value; 
    } 
    else { 
     $data = array_map('trim', array($value, $title)); 
     fputcsv($fp , $data, '|'); 
    } 
} 
fclose($fp); 
0

在這裏,你可以試試這個:

<?php 
$path = "text.txt"; 
$file = file($path); 
$outputFile = 'data.csv'; 

$datein = '1998-09-21'; 
if(preg_match('/^\d{4}-\d{2}-\d{2}\s\(i\)$/', $datein)){ 
    echo 'go'; 
}else{ 
    echo 'no go'; 
} 

$fp = fopen($outputFile,'w'); 

$name = ""; 
foreach($file as $value) 
{ 


    // match a date-line 
    if(preg_match('/^\d{4}-\d{2}-\d{2}\s\(i\)$/', $value)) { 

    $line = trim(preg_replace('/\s+/', ' ', $value)) . "|" . $name; 
    fwrite($fp,$line); 
    } else { 

     $name = $value; 
    } 
} 
fclose($fp); 
?> 

注意,我感動$name = '';外循環,並改變了它使用正則表達式。 trim(preg_replace...函數用於刪除當行被讀取並存儲到數組中時自動出現的換行符。

+0

OP所需的全部內容都是在'foreach'外部移動'name ='「''。所有其他的東西根本沒用。 –

+0

直到某人的名字由於某種原因在其中有括號。雖然'preg_match()'*比* strpos()更昂貴 –