1

我尝试通过 PHP 解析一个 csv 文件SplFileObject。可悲的是SplFileObject,如果文本中有错误的不可见字符,有时会卡住。该函数在遍历 csv 文件中的行时检测引用而不是跳过或读取它作为普通字符。下面的截图来自 Textwrangler:

在此处输入图像描述

我还在这里从 Textwrangler 复制了它(不可见的字符应该在“forgé”和“Circa”之间):

Fer forgé.� Circa

我的代码(SplFileObject 部分):

$splFile = new \SplFileObject($file);
$splFile->setFlags(\SplFileObject::DROP_NEW_LINE | \SplFileObject::SKIP_EMPTY | \SplFileObject::READ_AHEAD | \SplFileObject::READ_CSV);
$splFile->setCsvControl(",", '"', '"');

我试图找出 csv 文件通过file -I my.csv. 输出:my.csv: application/octet-stream; charset=binary。这是一个奇怪的结果,因为该文件可以通过 Textwrangler 读取,因此不是二进制文件。我还阅读了以相同方式生成的另一个 csv,并且输出与预期的一样:second.csv: text/plain; charset=utf-8. 用于生成 csv 文件的工具称为Visual Web Ripper(用于抓取网页的工具)。

我如何确定这个倒置问号是哪个字符(它似乎不是西班牙语倒置问号 - 可能只是 Textwrangler 插入的占位符)?如何删除我的 csv 文件中的这个字符和所有“无效”字符?是否有一个正则表达式匹配每个字符、数字、符号(标点符号和其他文本符号),实际上是一个真正的字符并省略了上面示例中的内容?我正在寻找一个 unicode 安全的正则表达式(需要保留德语变音符号、法语、俄语、中文、日语和韩语字符)。或者:如何将 csv 文件转换charset=binaryUTF-8

编辑: 如果我通过nano编辑器打开它,它会显示forgé.^@ Circa. 快速搜索后,它似乎是一个 NUL 字符或 \u0000(请参阅评论和https://en.wikipedia.org/wiki/Null_character以供参考)。

编辑 2: 我对其进行了深入研究:该函数似乎存在问题,该$splFile->current()函数在当前文件指针处读取一行。该行在NUL字符之后被截断(无论我尝试通过SplFileObject::READ_CSV还是普通字符串(不带SplFileObject::READ_CSV参数)读取它)。

4

1 回答 1

0

解决方案是省略SplFileObject::DROP_NEW_LINE参数。我还检查了NUL字符是否存在:它存在,但现在被视为 csv 中特定列的文本值的一部分,并且未被检测为引号或列附件。

当然,您现在必须使用 fe 自己过滤掉空行,例如:

$splFileObject = new \SplFileObject();
$splFileObject->setFlags(\SplFileObject::SKIP_EMPTY | \SplFileObject::READ_AHEAD | \SplFileObject::READ_CSV);

$columns = $splFileObject->current();
if (count($columns) === 1 && array_key_exists(0, $columns) && $columns[0] === NULL) {
   // empty csv line
}
于 2017-09-12T07:15:27.770 回答