我正在尝试解析一个csv文件,其中我的数据的格式如下:
"Total","Shazam (DE)","Total",,"215,611","538","£935.97","£60.77"
现在,如果我给fgetcsv(),如下所示:
$values = fgetcsv($f,8098);
它返回一个数组:
array(9) {
[0]=>
string(15) ""Total""
[1]=>
string(27) ""Shazam (DE)""
[2]=>
string(15) ""Total""
[3]=>
string(1) ""
[4]=>
string(9) ""215"
[5]=>
string(9) "611""
[6]=>
string(11) ""538""
[7]=>
string(19) ""£935.97""
[8]=>
string(19) ""£60.77"
"
}
但现在,如果我给出一个if语句,如:
$values = fgetcsv($f,8098);
if ($values[0] == "Total")
echo "Hello";
它没有回应任何东西,为什么条件不满意?是否与封闭的引号有关?
我甚至尝试过转义引号,例如
if ($values[0] == '\"Total\"')
echo "Hello";
但没有用。
我需要更改任何.ini设置吗?请帮帮我。
编辑:我尝试过做var_dump,它确实显示了包含引号的值:
array(9) {
[0]=>
string(15) ""Total""
[1]=>
string(27) ""Shazam (DE)""
[2]=>
string(15) ""Total""
[3]=>
string(1) ""
...
}
但即便
$values[0] == "\"Total\""
没用。什么应该是正确的比较器?
更新:经过几个小时的漫无目的的反复试验,终于找到了令人讨厌的东西,但它解决了我的问题。
最初,当我尝试打开我的csv文件时,它打开了一个带有ÿþD“”的记事本,因为它的内容。我做的是复制整个文件内容并创建一个具有相同名称的新csv文件,令我惊讶的是,它有效。
旧文件在MS-EXCEL / NOTEPAD中打开很好,但在excel中,每行都显示在一个单元格内。
我的问题是, .csv fromat的问题是什么?有没有人在此之前解决过这样的问题?
答案 0 :(得分:2)
我认为你需要定义一个文本限定符,这在fgetcsv中称为enclosure。 例如:
$values = fgetcsv($f,8098,'"');
// the last part is: singlequote doublequote singlequote,
// you could also use an escape "\""
这是告诉解析器它不应该在文本区域内使用逗号。
你应该可以这样做:
$values[0] == '"Total"'
更新:
你奇怪地打开文件的问题,可能与此有关 文件编码,通过创建新文件,您使用新文件创建它 编码可能是原始文件不是ANSI / UTF-8 / Unicode,然后在那里复制了内容,所以现在它以那种格式保存了。我不知道为什么这会给你遇到的问题,但即时通讯假设解析器无法以某种方式处理错误的编码。
尝试打开记事本并注意当你点击另存为时,你可以在按钮中选择编码,尝试使用不同编码的几个不同文件,如果你想确定它是吗?