【问题标题】:Can't convert to integer number coming from .csv file无法转换为来自 .csv 文件的整数
【发布时间】:2016-01-05 02:06:59
【问题描述】:

我将 .csv 文件中的数据放入数组中,但数字以字符串形式出现。当我尝试将它们转换回整数时,它们变为0。我用来从 .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"

【问题讨论】:

  • var_dump($res[0]) 告诉我们结果。
  • 很可能您将非数字字符串转换为整数,尽管您认为自己是。
  • 我把var_dump($res[0])的结果放上去,可以看到值都是整数
  • 看到了吗?你那里有字符串。但我确信这不是全部真相。请输出var_dump(bin2hex($res[0])); 以显示是否有隐藏字符可能会干扰您的整数转换
  • string(15) "1437961".... 我只计算 7 个可见字符....这是双字节编码吗?

标签: php excel csv


【解决方案1】:

一种解决方案是使用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,但它有时会有点反复无常。

【讨论】:

  • 在我的情况下是 UTF-8 BOM,但这是至关重要的线索。谢谢。
猜你喜欢
  • 2021-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-03
相关资源
最近更新 更多