【发布时间】:2013-05-26 00:20:46
【问题描述】:
我正在构建一个接受 CSV 或制表符分隔文件的工具,然后将对其进行解析并将数据数据库化。
上传的文件可以是 CSV 或制表符分隔的。
我想出了一个可行的解决方案(如下)来检测文件可能采用的格式,并想知道是否有更好的方法来解决这个问题和/或你们中的任何人如何解决同样的问题.
谢谢
<?php
$csv_comma='Fruit,Color
Apple,"Red,Green"
Tomato,"Red,Green"
Banana,Yellow
Tangerine,Orange
';
$csv_semi_colon='Fruit;Color
Apple;"Red,Green"
Tomato;"Red,Green"
Banana;Yellow
Tangerine;Orange
';
$tab_delimited='Fruit Color
Apple Red,Green
Tomato Red,Green
Banana Yellow
Tangerine Orange';
$fileArr = array($csv_comma,$csv_semi_colon,$tab_delimited);
foreach($fileArr as $file){
if(preg_match('/^(.+),(.+)/',trim($file))){
echo "CSV with comma separator";
}
if(preg_match('/^(.+);(.+)/',trim($file))){
echo "CSV with semi colon separator";
}
if(preg_match('/^(.+)\t(.+)/',trim($file))){
echo "Tab delimited";
}
}
【问题讨论】:
-
任何启发式方法都会给出错误的结果。您只是无法 100% 正确地猜出使用了什么分隔符
-
Here Python 是如何做到的。
-
为什么不尝试用
fgetcsv和, or ; ... etc作为分隔符来解析csv?如果失败,则它一定不是有效的 csv。 -
或者为什么不在您的上传表单中设置三个单选按钮,用户可以在其中指定在他们上传的文件中使用哪些分隔符...?
-
如果你只读取文件的第一行并匹配它而不是匹配整个文件会更好 - 它会更快并且使用更少的系统资源。