2015-07-11 2 views
0

У меня возникают проблемы с разбором файла csv в php, используя fopen(), берущие данные API.Parsing PHP с проблемой кодирования fopen()

Мой код работает, когда я использую URL-адрес, который отображает файл csv в браузере, как указано в 1) ниже. Но я получаю случайные символы, выводимые из URL-адреса, который заканчивается в формате = csv, как показано в 2) ниже.

1)Рабочий URL: Возвращается ожидаемые значения https://www.kimonolabs.com/api/csv/duo2mkw2?apikey=yjEl780lSQ8IcVHkItiHzzUZxd1wqSJv

2)не работает URL: Возвращает случайные символы https://www.parsehub.com/api/v2/projects/tM9MwgKrh0c4b81WDT_4FkaC/last_ready_run/data?api_key=tD3djFMGmyWmDUdcgmBVFCd3&format=csv

Вот мой код : - с помощью URL (2) выше

<?php 

$f_pointer=fopen("https://www.parsehub.com/api/v2/projects/tM9MwgKrh0c4b81WDT_4FkaC/ last_ready_run/data?api_key=tD3djFMGmyWmDUdcgmBVFCd3&format=csv","r"); 


while(! feof($f_pointer)){ 
    $ar=fgetcsv($f_pointer); 


echo $ar[1]; 


echo "<br>"; 
    } 
?> 


Выход: Для получения URL, указанного в (2) выше:

корень @ MorryServer:/# PHP testing.php

? IU? Q? JL??/Q? R? /)? J-.?))VH?/OM?K-NI?T0?P?*ͩT0204jz Դ? H ??? X? ? @ D ?? K


Правильный выход: Если я использую URL типа, как указано в (1)

корень @ MorryServer:/# PHP testing.php

PHP Примечание: Undefined смещение: 1 в/testing.php на линии 24

джекпота € 2.893.210

+0

Первые URL возвращает данные с тем, что выглядит как название в качестве первого значения. Это недопустимый CSV (или, по крайней мере, нетрадиционный), поэтому функции CSV PHP будут иметь проблемы с этим. Второй URL, похоже, возвращает допустимые значения CSV. Вместо использования 'fopen' (который вы не должны использовать в любом случае, это низкоуровневая функция, которая должна использоваться только в том случае, если вам нужно ее использовать), вы должны использовать что-то вроде' str_getcsv', которое было создано для таких вещей, как это. –

+0

Привет, Сверри, первый URL-адрес в порядке, я могу удалить заголовки, проблема - странный вывод для 2). Мне нужен код для работы с parsehub url –

+0

Что вы получите, если вы запустите это: 'php -r 'echo mb_internal_encoding();" Второй URL выглядит отлично. Он возвращает файл с mimetype 'text/csv', закодированный с помощью' UTF-8'. Немного устаревшие версии PHP по умолчанию использовали 'iso-8859-1'. В более новых версиях используется 'utf-8'. Какова ваша версия PHP? –

ответ

1

Это encodi ng проблема.

Данный файл содержит символы UTF-8. Они считываются функцией fgetcsv, которая является бинарной безопасностью. Линейные окончания - Unix-Format ("\ n").

Выход на терминал разрушен. Глядя на заголовки посланных, мы видим:

GET https://www.parsehub.com/api/v2/projects/tM9MwgKrh0c4b81WDT_4FkaC/last_ready_run/data?api_key=tD3djFMGmyWmDUdcgmBVFCd3&format=csv --> 200 OK 
Connection: close 
Date: Sat, 11 Jul 2015 13:15:24 GMT 
Server: nginx/1.6.2 
Content-Encoding: gzip 
Content-Length: 123 
Content-Type: text/csv; charset=UTF-8 
Last-Modified: Fri, 10 Jul 2015 11:43:49 GMT 
Client-Date: Sat, 11 Jul 2015 13:15:23 GMT 
Client-Peer: 107.170.197.156:443 
Client-Response-Num: 1 
Client-SSL-Cert-Issuer: /C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA Domain Validation Secure Server CA 
Client-SSL-Cert-Subject: /OU=Domain Control Validated/OU=PositiveSSL/CN=www.parsehub.com 

виду Content-Encoding: gzip: fgetcsv работает на URL, очевидно, не обрабатывать GZIP encosing. Скринированная строка - это просто содержимое gzipped в файле.

Посмотрите на gzip lib PHP, чтобы сначала спустить его, прежде чем разбирать его. Доказательство:

srv:~ # lwp-download 'https://www.parsehub.com/api/v2/projects/tM9MwgKrh0c4b81WDT_4FkaC/last_ready_run/data?api_key=tD3djFMGmyWmDUdcgmBVFCd3&format=csv' data 
123 bytes received 
srv:~ # file data 
data: gzip compressed data, was "tcW80-EcI6Oj2TYPXI-47XwK.csv", from Unix, last modified: Fri Jul 10 11:43:48 2015, max compression 
srv:~ # gzip -d < data 
"title","jackpot" 
"Lotto Results for Wednesday 08 July 2015","€2,893,210" 

Чтобы получить правильный вывод, минимальные изменения необходимо: Просто добавьте поток обертку:

<?php 

     $f_pointer=fopen("compress.zlib://https://www.parsehub.com/api/v2/projects/tM9MwgKrh0c4b81WDT_4FkaC/last_ready_run/data?api_key=tD3djFMGmyWmDUdcgmBVFCd3&format=csv","r"); 

     if ($f_pointer === false) 
       die ("invalid URL"); 

     $ar = array(); 
     while(! feof($f_pointer)){ 
       $ar[]=fgetcsv($f_pointer); 
     } 

     print_r($ar); 

?> 

Выходы:

Array 
(
    [0] => Array 
     (
      [0] => title 
      [1] => jackpot 
     ) 

    [1] => Array 
     (
      [0] => Lotto Results for Wednesday 08 July 2015 
      [1] => €2,893,210 
     ) 

) 
+0

Большое вам спасибо! Это один целый день, потерянный по этому вопросу :) - Время за чашкой чая :) –