我将.csv文件中的数据放入数组中,但数字以字符串形式出现。当我尝试将它们转换回整数时,它们变为0
。代码I用于从.csv文件中获取数据:
$reportData = [];
$file = fopen('DailyReport.csv','r');
while(!feof($file)){
$reportData[] = fgetcsv($file,NULL,'|');
}
我尝试使用以下方法转换数字:
foreach($reportData as $res){
$int[] = intval($res[0]);
//or
$int[] = (int)$res[0];
//or even
$int[] = $res[0]*1;
这些都不起作用,任何想法为什么?
$res[0]
的值始终为整数。当我运行var_dump($res[0]);
时,结果为:
string(15) "1437961"
string(15) "1437971"
string(15) "1438127"
string(15) "1440392"
string(15) "1440394"
string(15) "1440399"
string(15) "1440924"
string(15) "1440986"
var_dump(bin2hex($ res [0]))返回:
string(30) "003100340033003700390036003100"
string(30) "003100340033003700390037003100"
string(30) "003100340033003800310032003700"
string(30) "003100340034003000330039003200"
string(30) "003100340034003000330039003400"
string(30) "003100340034003000330039003900"
string(30) "003100340034003000390032003400"
string(30) "003100340034003000390038003600"
答案 0 :(得分:0)
一种解决方案是使用mbstring模块转换从CSV文件读取的字符串的编码。
首先阅读文件:
$reportData = [];
$file = fopen('DailyReport.csv', 'r');
while(!feof($file)) {
$reportData[] = fgetcsv($file, NULL, '|');
}
您的var_dump(bin2hex(...))
输出表明DailyReport.csv是UTF-16BE。 (每个数字有两个字节,前导字节始终为零。尾随零字节表示UTF-16LE。)
让我们使用mbstring
将这些大端UTF-16字符串转换为UTF-8,然后转换为整数:
foreach($reportData as $res) {
$resUTF8 = mb_convert_encoding($res[0], 'UTF-8', 'UTF-16BE');
$resInt = intval($resUTF8);
echo $resInt, PHP_EOL; // <- we have actual integers here
}
这里可能的缺点是默认情况下可能无法启用mbstring
模块...或者,我们可以使用iconv,但有时可能会有点反复无常。