我使用fgetcsv
在我的应用程序中读取csv文件。问题是,我不知道我的用户是否会使用,
,|
或;
作为分隔符。如果我告诉fgetcsv
什么都不会接受,
,但如果我告诉它使用特定的分隔符,它只接受它。
我现在正在做的是:
while (($row = fgetcsv($fileHandle, 4096)) !== false) {
我想要的是这样的:
while (($row = fgetcsv($fileHandle, 4096, array(',', ';', '|'))) !== false) {
这有可能以一种简单的方式吗?由于CSV未标准化,因此您必须将分隔符限制为一个特定字符,这似乎很奇怪。
答案 0 :(得分:5)
如果您不了解csv文件的分隔符,则无法可靠地确定它。举个简单的例子:
foo;bar,hello;world
什么是分隔符? ,
或;
?如果您要传递数组array(',',';')
,您期望fgetcsv()
将返回哪些数据?
如果您不了解分隔符,则需要询问用户。
答案 1 :(得分:1)
使用league/csv软件包,它具有检测功能和更多功能,值得在fgetcsv上使用它。
答案 2 :(得分:0)
为其他任何挣扎于此的人提供一个简单的答案。我解决的解决方案是将所有分隔符替换为特定字符。 像这样:
private function replaceDelimiters($file)
{
// Delimiters to be replaced: pipe, comma, semicolon, caret, tabs
$delimiters = array('|', ';', '^', "\t");
$delimiter = ',';
$str = file_get_contents($file);
$str = str_replace($delimiters, $delimiter, $str);
file_put_contents($file, $str);
}
请注意,这会将所有给定的字符替换为','。因此,如果您知道这些字符仅用作分隔符而不是内容,那么这只是一个不错的选择。 (如我的情况)
还做了一个blog post。