【问题标题】:PHP parsing/typecasting problemsPHP 解析/类型转换问题
【发布时间】:2012-03-31 22:37:25
【问题描述】:

我要做的是转换一些存档的 CSV 数据。它在几千个文件上运行良好。我解析出日期并将其转换为时间戳。但是在一个文件上,不知何故它不起作用。我使用(int) $string 将解析后的字符串转换为int 值-> 它返回int(0)。我还使用了intval() -> 相同的结果。当我使用var_dump($string) 时,会得到一些奇怪的输出,例如string(9) "2008",实际上应该是string(4) "2008"。我试图在字符串上使用preg_match,但没有成功。这是编码问题吗?

这是一些代码,只是非常标准的东西:

date_default_timezone_set('UTC');
$ms = 0;
function convert_csv($filename)
{
$target = "tmp.csv";
$fp = fopen("$filename","r") or die("Can't read the file!");
$fpo = fopen("$target","w") or die("Can't read the file!");
while($line = fgets($fp,1024))
{
    $linearr = explode(",","$line");

    $time = $linearr[2];
    $bid = $linearr[3];
    $ask = $linearr[4];
    $time = explode(" ",$time);
    $date = explode("-",$time[0]);
    $year = (int) $date[0]);
    $month =  (int)$date[1];
    $day = (int)$date[2];
    $time = explode(":",$time[1]);

    $hour = (int)$time[0];
    $minute = (int)$time[1];
    $second = (int)$time[2];
    $time = mktime($hour,$minute,$second,$month,$day,$year);

    if($ms >= 9)
    {
        $ms = 0;
    }else
    {
        $ms ++;
    }
    $time = $time.'00'.$ms;
    $newline = "$time,$ask,$bid,0,0\n";
    fwrite($fpo,$newline);

}
fclose($fp);
fclose($fpo);
unlink($filename);
rename($target,$filename);

}

这是我们正在讨论的文件的链接:

【问题讨论】:

  • 请给我们看一些代码。你也有string(9) "2008"
  • 字符串的十六进制转储肯定是个好主意,因为看似太长的字符串长度表明其中有一些字节您的输出查看器不能或不会显示。
  • 感谢您的 cmets,我刚刚添加了代码!

标签: php parsing casting


【解决方案1】:

文件好像是用UTF-16编码的,所以确实是编码问题。 string(9) 是由将 UTF-16 解释为单字节编码时得到的空字节引起的。

这使得使用fgets 之类的函数难以读取文件,因为它们是二进制安全的,因此不支持编码。您可以读取内存中的整个文件并执行编码转换,但这非常低效。

我不确定是否可以使用原生 PHP 函数以 UTF-16 格式正确读取文件。您可能需要编写或使用外部库。

【讨论】:

    【解决方案2】:

    您可以尝试使用 iconv 将您的文件转换为计划 ascii。

    如果您使用的是具有 iconv 命令的 linux 或类似系统:

    $ iconv -f UTF16 -t ASCII EUR_USD_Week1.csv > clean.csv

    否则你可能会发现 PHP iconv 函数很有用:

    http://php.net/manual/en/function.iconv.php

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-28
      • 2011-11-17
      • 2023-03-06
      • 2011-10-01
      • 1970-01-01
      相关资源
      最近更新 更多