2015-07-11 71 views
0

我在使用fopen()接收API數據時,在解析php中的csv文件時出現問題。使用fopen()編碼問題解析PHP

我的代碼在我使用在瀏覽器中顯示csv文件的URL時起作用,如1)下面所述。但是我得到一個從格式= csv結尾的URL輸出的隨機字符,如2)所示。

1)工作網址:返回期望的值 https://www.kimonolabs.com/api/csv/duo2mkw2?apikey=yjEl780lSQ8IcVHkItiHzzUZxd1wqSJv

2)不工作的網址:返回隨機字符 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-。?)?V????????????????????????????????? ?? @ D ?? K


正確的輸出:如果我使用URL類型如(1)

根@ MorryServer指出:/#PHP testing.php

PHP通知:未定義偏移:1 /上線24 testing.php
頭獎

+0

先用什麼樣子的URL返回數據像一個標題作爲第一個價值。這是無效的CSV(或至少非常規),所以PHP的CSV功能將有一個問題。第二個網址似乎會返回有效的CSV值。而不是使用'fopen'(你不應該使用它;它是一個低級函數,只有在你必須使用它的時候才能使用),你應該使用像'str_getcsv'這樣的東西,這個。 –

+0

嗨Sverri,第一個網址是好的,我可以刪除標題,問題是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問題。

給定文件包含UTF-8字符。這些由fgetcsv函數讀取,這是二進制安全的。行尾是Unix格式(「\ 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: gzipfgetcsv上的URL的工作並不明顯gzip的處理encosing。 scrumbled字符串只是「文件」的gzip內容。

看看PHP的gzip庫,首先在解析它之前解壓。 證明:

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

非常感謝!這是一整天失去了這個問題:) - 一杯茶的時間:) –