在PHP中重新格式化文本文件
我有一个文本文件在PHP中重新格式化文本文件,php,csv,Php,Csv,我有一个文本文件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| | 20
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 />";
}
}
?>
在这里,您可以尝试以下操作:
<?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…
函数用于删除读取并存储到数组中时自动出现的换行符。根据您当前的代码,您只需写出名称……永远不会。否则,会把您搞糟。我将为您编写一个快速版本。输出文件是什么样子的?move$name=“”
outsideforeach
Moving name out现在只给我最后一行文本文件。“2011-06-14(i)”、“name3”
fopen
和fclose
也需要移出循环。所需的所有操作都是movename=“”
外部foreach
。所有其他东西都毫无用处。直到某人的名字因为某种原因被插入括号。尽管preg\u match()
比strpos()更贵。
$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);