我正在构建一个接受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";
}
}
答案 0 :(得分:1)
好的csv有很多实现。
csv的默认值为,
,但sep=
可以指定其他分隔符。
您可以将其实现为csv。因此,您的默认值为,
,但如果sep
已定义,则使用该值。
您的文件可能如下所示:
apple, orange, tomato
或
sep=;
apple; orange; tomato
因此,如果第一行以sep开头,则它是“选项”行,否则有值。对于标签,您执行sep=\t
现在用户可以定义自己的分隔符而不再猜测
在对用户易于使用的CBroe的一些评论之后,可能会有一些变化。 csv只接受一个charachter作为septerator,以便系统可以像上面那样使用。 cvs编辑器(如excel)将为用户处理
如果用户使用该选项卡,则它不是csv文件,而是.txt(例如)。因此,您可以根据给定的文件更改默认值。
另外我想补充一点,已经在评论中指出,如果你想猜测你会发现它会发生错误。
我不知道文件的设置,但csv行需要长度相同(根据我的记忆)。所以你能做的就是读出前x行。并使用每个分隔符。
之后你检查哪些线长度相同,最有可能是你的分隔符(再次猜测)
答案 1 :(得分:0)
您可以使用此类模式检查csv结构并确定分隔符:
if (preg_match('^(?:("[^"]++"|[^,;\t\n]++)(?<sep>[,\t;])(?1)(?:\n|$))++$', $csv_comma, $match))
print_r($match['sep']);