我正在尝试解析一个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格式的问题是什么?以前有人遇到过这样的问题吗?
我认为您需要定义一个文本限定符,这在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的东西,原来的文件不是,然后复制的内容在那里,所以现在它被保存在那个格式。我不确定为什么这会给你带来你正在经历的问题,但我假设解析器不知怎么地不能处理错误的编码。
试着打开记事本,注意当你点击另存为时,你可以在按钮中选择编码,尝试使用几个不同的文件,如果你想确保它是不同的编码?