1

我正在尝试读取 Linux 上 M$ Excel 生成的 CSV 文件。

该文件引用了多行(x0A 分隔)列和 0x0d0a 行终止。

Linux 上的 PHP 使用 0x0a 作为行终止符,因此所有基于行的工具(文件、fgets、fgetcsv)都认为数据单元格中间有记录中断。

由于无法逐字节处理文件,我可以临时更改 PHP 的行尾字符(PHP_EOL 常量),以便轻松解析文件。

我认为它可以用“$\”在 perl 中完成。PHP中有类似的东西吗?

我意识到我可以逐字节解析,但我正在寻找一种更清洁的方法。

4

2 回答 2

1

您可以尝试使用 ' auto_detect_line_endings' 运行时配置选项。它说使用它会自动找出正确的行尾。从文档:

打开时,PHP 将检查 fgets() 和 file() 读取的数据,以查看它是否使用 Unix、MS-Dos 或 Macintosh 行结束约定。

这使 PHP 可以与 Macintosh 系统互操作,但默认为 Off,因为在检测第一行的 EOL 约定时性能损失非常小,而且在 Unix 系统下使用回车作为项目分隔符的人会遇到非向后兼容的行为。

如果这不起作用,那么您始终可以将整个文件读入内存(取决于文件大小,这可能不可行)并对有问题的字符执行 preg_replace ,将它们替换为“正确”字符。

于 2009-08-01T07:02:52.403 回答
1

如果conceptDawg 的建议auto_detect_line_endings不起作用,我建议通过file_get_contents () 读取整个文件,然后调用explode () 将文件分成多行。你可以传递任何你想要的字符explode()

于 2009-08-01T13:48:18.740 回答