无法转换为来自.csv文件的整数

时间:2015-10-07 17:47:01

标签: php excel csv

我将.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"

1 个答案:

答案 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,但有时可能会有点反复无常。