使用PHP读取CSV文件并创建另一个CSV文件

5

我有一个 .csv 文件,当我通过记事本打开它时,它看起来像:

ID501501503502

当我通过PHP在浏览器中打印它时,它看起来像:

ID 501 501 503 502

我的代码是:

$handle = fopen("MonC1.csv", "r");
$data = fgetcsv($handle, 0);
$fh = fopen('php://output', 'w');
if (! empty($data)) {
  foreach ($data as $item) {
      echo $item."<br>";
     //fputcsv($fh, array($item));
  }
}

基本上,for循环中的br标签不起作用。这是我的第一个问题。

即使我使用fputcsv(现在已关闭),它也不会创建实际的csv文件,这是我的第二个问题。

现在我的问题是,在记事本中没有空格,但在浏览器中打印时会出现空格。

我只有一列,没有其他内容。

非常感谢任何帮助。提前致谢。


1
那个脚本实际生成了什么HTML? - EWit
实际上它正在打印CSV文件的内容。因此,如果源文件是一个包含ID123的CSV文件,那么echo将打印ID 1 2 3。就这样。 - Raj
@EWit 询问 HTML 响应的源代码位置。 - vp_arth
2
看起来你的原始文件是使用UNIX换行符保存的,然后在Windows中使用fgetcsv,所以整个文件被读取为一行。可能在整个输出的末尾有一个<br> - Interrobang
嗯...@Interrobang,那很有道理。让我检查一下。 - Raj
显示剩余2条评论
1个回答

0

如我在评论中提到的那样,看起来您的原始文件是使用UNIX换行符保存的,然后在Windows中使用fgetcsv,因此整个文件被读取为一行。可能在整个输出的末尾有一个<br>

因此,在处理文件之前,您需要预处理它以转换行结尾。

在Linux上,实用程序unix2dos可以实现您想要的功能。或者,您可以在文件中将\n替换为\r\n

另一个问题是fgetcsv不会将整个文件转换为数组。相反,它从文件句柄中读取单个行,并将其转换为数组。您需要在循环内部读取行:

while (($data = fgetcsv($handle)) !== FALSE) {
  // $data contains one line of the CSV, in array form
  // now you can fputcsv the single line
}

太棒了。现在我已经成功将数据写入实际的csv文件中。虽然还不完美,但由于它与这个问题无关,所以我可能会在花费一些时间后发布另一个问题。再次感谢您的帮助。 - Raj
我认为它没有正常工作。我使用了 while (($data = fgetcsv($handle)) !== FALSE) { echo $data[0]."<br>"; } 但在浏览器中输出仍然是单行。不确定我的错误在哪里。 - Raj
你没有修复行尾。有两件事需要修复;你只添加了while循环。 - Interrobang
不确定怎么办,如果数组只包含一行,我该如何放置'\n'。 - Raj
我需要用 \r 替换成 \n 吗? - Raj

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接