【发布时间】:2014-12-30 07:11:04
【问题描述】:
我已经看到了多个关于自动检测传入 CSV 分隔符的最佳解决方案的主题。其中大部分是长度在 20 - 30 行之间的函数,多个循环预先确定的分隔符列表,读取前 5 行并匹配计数 e.t.c e.t.c
我刚刚实现了这个过程,做了一些修改。效果很好。
然后我找到了以下代码:
private function DetectDelimiter($fh)
{
$data_1 = null;
$data_2 = null;
$delimiter = self::$delim_list['comma'];
foreach(self::$delim_list as $key=>$value)
{
$data_1 = fgetcsv($fh, 4096, $value);
$delimiter = sizeof($data_1) > sizeof($data_2) ? $key : $delimiter;
$data_2 = $data_1;
}
$this->SetDelimiter($delimiter);
return $delimiter;
}
在我看来,这似乎实现了相同的结果,其中 $delim_list 是一个分隔符数组,如下所示:
static protected $delim_list = array('tab'=>"\t",
'semicolon'=>";",
'pipe'=>"|",
'comma'=>",");
任何人都可以解释为什么我不应该以这种更简单的方式来做,以及为什么在我看来更复杂的解决方案似乎是公认的答案?
谢谢!
【问题讨论】:
-
我认为这个解决方案更具可读性,并且更清洁了链接中的另一个示例。
-
只有我一个人认为神奇地确定分隔符在逻辑上是错误的吗?如果分隔符不是逗号(顾名思义 - 逗号分隔值),则在请求中查找指定的分隔符。如果没有,则中止解析,直到发送有效信息。
-
@N.B.你有一个有效的观点。对于这个项目,我只需要在给用户选项之前猜测。如果使用上面详述的方法 2 未能给我任何合法数据,那么我将要求用户指定他们的分隔符。然而,我喜欢方法 1 的一点是,如果它找到 2 个或更多匹配的分隔符,那么我可以通知用户并让他们从我认为我找到的选项中进行选择,或者建议他们自己的。