我要做的是转换一些存档的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);
}
以下是我们正在讨论的文件的链接:
答案 0 :(得分:2)
该文件似乎是在UTF-16中编码的,所以它确实是一个编码问题。 string(9)
是由UTF-16解释为单字节编码时得到的空字节引起的。
这使得文件很难用fgets
等函数读取,因为它们是二进制安全的,因此不能识别编码。你可以在内存中读取整个文件并执行编码转换,但这非常低效。
我不确定是否可以使用本机PHP函数将文件正确读取为UTF-16。您可能需要编写或使用外部库。
答案 1 :(得分:0)
您可以尝试使用iconv将文件转换为计划ascii。
如果您使用的是具有iconv命令的Linux或类似系统:
$ iconv -f UTF16 -t ASCII EUR_USD_Week1.csv> clean.csv
否则你可能会发现PHP iconv函数很有用: