Проблемы с синтаксическим анализом и типизацией PHP - PullRequest
0 голосов
/ 15 марта 2012

Я пытаюсь преобразовать некоторые заархивированные данные 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);

}

Вот ссылка на файл, о котором мы говорим:

Ответы [ 2 ]

2 голосов
/ 15 марта 2012

Файл, кажется, закодирован в UTF-16 , так что это действительно проблема кодирования. string(9) вызвано нулевыми байтами, которые вы получаете, если UTF-16 интерпретируется как однобайтовая кодировка.

Это затрудняет чтение файла с помощью таких функций, как fgets, поскольку они безопасны для двоичного кода и, следовательно, не поддерживают кодирование. Вы можете прочитать весь файл в памяти и выполнить преобразование кодировки, но это ужасно неэффективно.

Я не уверен, что можно правильно прочитать файл как UTF-16 с использованием встроенных функций PHP. Возможно, вам придется написать или использовать внешнюю библиотеку.

0 голосов
/ 15 марта 2012

Вы можете попытаться преобразовать свой файл в план ascii, используя iconv.

Если вы используете Linux или аналогичную систему, в которой есть команда iconv:

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

В противном случае вы можете найти полезную функцию PHP iconv:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...