fgetcsv 无法正确识别转义字符
fgetcsv not recognizing escape character correctly
我有一个 CSV 字符串文件,如下所示:
"12345","445 Maple St.","Going to the "orange" store","610-123-4567"
我正在使用以下内容解析每一行:
while (($data = fgetcsv($file_matters, 500, ',', '"', '"')) !== FALSE)
而不是像这样获取数组:
array(4) (
[0] => (string) 12345
[1] => (string) 445 Maple St.
[2] => (string) Going to the "orange" store
[3] => (string) 610-123-4567
)
我得到:
array(4) (
[0] => (string) 12345
[1] => (string) 445 Maple St.
[2] => (string) Going to the orange" store"
[3] => (string) 610-123-4567
)
注意不正确的双引号。它们应该像 "orange"
这样包裹在橙色周围,但正如您所见,它们不是。我正在使用 fgetcsv
的第 5 个参数,它应该自动转义双引号。有什么想法吗?
在您的 CSV 文件中,您需要对内容进行转义。
$csvContent = str_replace(' "', ' \"', $csvContent);
$csvContent = str_replace('" ', '\" ', $csvContent);
您只需从 csv 文件中获取数据并使用 (,)。然后使用 trim () 函数删除双引号,如下所示。我希望,我解决了你的问题。
Book1.csv
"12345","445 Maple St.","Going to the "orange" store","610-123-4567"
代码是
<?php
$row = 1;
$handle = fopen("Book1.csv", "r");
while (($data = fgetcsv($file_matters,500, ",")) !== FALSE) {
$num = count($data);
$row++;
for ($i=0; $i < $num; $i++) {
$hh=$data[$i];
$a[]=trim($hh,'"') ;// remove "" and save in a array
// $a=trim($hh,'"') ;
//echo$a. "<br />\n";
}
}
fclose($file_matters);
print_r($a);
?>
结果
Array ( [0] => 12345
[1] => 445 Maple St.
[2] => Going to the "orange" store
[3] => 610-123-4567 )
我不确定您的 CSV 语法是否真的有效;例如,这将是有效的:
"12345","445 Maple St.",Going to the "orange" store,"610-123-4567"
您的摘录无效,因为您在 "
中有 "
。
CSV 不 要求所有字段都用引号引起来,PHP 也可以处理带有未引号块的 CSV 行。
php > var_dump(
> str_getcsv('"12345","445 Maple St.",Going to the "orange" store,"610-123-4567"')
> );
array(4) {
[0]=>
string(5) "12345"
[1]=>
string(13) "445 Maple St."
[2]=>
string(27) "Going to the "orange" store"
[3]=>
string(12) "610-123-4567"
}
我有一个 CSV 字符串文件,如下所示:
"12345","445 Maple St.","Going to the "orange" store","610-123-4567"
我正在使用以下内容解析每一行:
while (($data = fgetcsv($file_matters, 500, ',', '"', '"')) !== FALSE)
而不是像这样获取数组:
array(4) (
[0] => (string) 12345
[1] => (string) 445 Maple St.
[2] => (string) Going to the "orange" store
[3] => (string) 610-123-4567
)
我得到:
array(4) (
[0] => (string) 12345
[1] => (string) 445 Maple St.
[2] => (string) Going to the orange" store"
[3] => (string) 610-123-4567
)
注意不正确的双引号。它们应该像 "orange"
这样包裹在橙色周围,但正如您所见,它们不是。我正在使用 fgetcsv
的第 5 个参数,它应该自动转义双引号。有什么想法吗?
在您的 CSV 文件中,您需要对内容进行转义。
$csvContent = str_replace(' "', ' \"', $csvContent);
$csvContent = str_replace('" ', '\" ', $csvContent);
您只需从 csv 文件中获取数据并使用 (,)。然后使用 trim () 函数删除双引号,如下所示。我希望,我解决了你的问题。
Book1.csv
"12345","445 Maple St.","Going to the "orange" store","610-123-4567"
代码是
<?php
$row = 1;
$handle = fopen("Book1.csv", "r");
while (($data = fgetcsv($file_matters,500, ",")) !== FALSE) {
$num = count($data);
$row++;
for ($i=0; $i < $num; $i++) {
$hh=$data[$i];
$a[]=trim($hh,'"') ;// remove "" and save in a array
// $a=trim($hh,'"') ;
//echo$a. "<br />\n";
}
}
fclose($file_matters);
print_r($a);
?>
结果
Array ( [0] => 12345
[1] => 445 Maple St.
[2] => Going to the "orange" store
[3] => 610-123-4567 )
我不确定您的 CSV 语法是否真的有效;例如,这将是有效的:
"12345","445 Maple St.",Going to the "orange" store,"610-123-4567"
您的摘录无效,因为您在 "
中有 "
。
CSV 不 要求所有字段都用引号引起来,PHP 也可以处理带有未引号块的 CSV 行。
php > var_dump(
> str_getcsv('"12345","445 Maple St.",Going to the "orange" store,"610-123-4567"')
> );
array(4) {
[0]=>
string(5) "12345"
[1]=>
string(13) "445 Maple St."
[2]=>
string(27) "Going to the "orange" store"
[3]=>
string(12) "610-123-4567"
}