使用分隔符数组
Use array of delimiters
我正在使用 fgetcsv
在我的应用程序中读取 csv 文件。问题是我不知道我的用户是否会使用 ,
、|
或 ;
作为分隔符。如果我什么都不告诉 fgetcsv
它只会接受 ,
但如果我告诉它使用特定的定界符它只会接受那个。
我现在做的是:
while (($row = fgetcsv($fileHandle, 4096)) !== false) {
我想要的是这样的:
while (($row = fgetcsv($fileHandle, 4096, array(',', ';', '|'))) !== false) {
有没有可能用一些简单的方法?由于 CSV 未标准化,您必须将分隔符限制为一个特定字符,这似乎真的很奇怪。
如果您不知道 csv 文件的分隔符,则无法可靠地确定它。举个简单的例子:
foo;bar,hello;world
什么是分隔符? ,
还是 ;
?如果你要传递一个数组 array(',',';')
你期望什么数据 fgetcsv()
会 return?
如果您不知道分隔符,您需要询问用户。
使用 league/csv 包,它具有检测功能和更多功能,值得在 fgetcsv 上使用它。
只是想为遇到此问题的其他人提供一个简单的答案。我确定的解决方案是将所有定界符替换为特定字符。
像这样:
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。
我正在使用 fgetcsv
在我的应用程序中读取 csv 文件。问题是我不知道我的用户是否会使用 ,
、|
或 ;
作为分隔符。如果我什么都不告诉 fgetcsv
它只会接受 ,
但如果我告诉它使用特定的定界符它只会接受那个。
我现在做的是:
while (($row = fgetcsv($fileHandle, 4096)) !== false) {
我想要的是这样的:
while (($row = fgetcsv($fileHandle, 4096, array(',', ';', '|'))) !== false) {
有没有可能用一些简单的方法?由于 CSV 未标准化,您必须将分隔符限制为一个特定字符,这似乎真的很奇怪。
如果您不知道 csv 文件的分隔符,则无法可靠地确定它。举个简单的例子:
foo;bar,hello;world
什么是分隔符? ,
还是 ;
?如果你要传递一个数组 array(',',';')
你期望什么数据 fgetcsv()
会 return?
如果您不知道分隔符,您需要询问用户。
使用 league/csv 包,它具有检测功能和更多功能,值得在 fgetcsv 上使用它。
只是想为遇到此问题的其他人提供一个简单的答案。我确定的解决方案是将所有定界符替换为特定字符。 像这样:
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。