在PHP中重新格式化文本文件


Reformat text file in PHP

我有一个文本文件text.txt,其中日期是这样安排的。

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)

我想把文件分成两列,如:

+---------------+-----+
| 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 />";
  }
}
?>
$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);

这里,您可以试试:

<?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...函数是用来删除换行符的,当行被读取并存储到数组中时,换行符会自动出现。