2011-09-21 115 views
8

我有機場代碼和城市名稱(大約3500行)的這個數組。將CSV轉換爲數組

code,city 
"Abilene, TX ",ABI 
"Adak Island, AK ",ADK 
"Akiachak, AK ",KKI 
"Akiak, AK ",AKI 
"Akron/Canton, OH ",CAK 
"Akuton, AK ",KQA 
"Alakanuk, AK ",AUK 
"Alamogordo, NM ",ALM 

我需要將該文件轉換爲一個php數組。這是到目前爲止我的代碼:

if(($handle = fopen('test.csv', 'r')) !== FALSE) { 
    while (($data = fgetcsv($handle, 1000, ',', '"')) !== FALSE) { 
     echo '<pre>'; 
      print_r($data); 
      echo '</pre>'; 
    } 
    fclose($handle); 
} 

雖然我設置的分隔符,enclousure個字符fgetcsv功能,即時得到這個結果:

Array 
(
    [0] => code 
    [1] => city 
"Abilene 
    [2] => TX " 
    [3] => ABI 
"Adak Island 
    [4] => AK " 
    [5] => ADK 
"Akiachak 
    [6] => AK " 
    [7] => KKI 
"Akiak 
    [8] => AK " 
    [9] => AKI 
"Akron/Canton 
    [10] => OH " 
    [11] => CAK 
"Akuton 
    [12] => AK " 
    [13] => KQA 
"Alakanuk 
    [14] => AK " 
    [15] => AUK 
"Alamogordo 
    [16] => NM " 
    [17] => ALM 
) 
+2

你確定那些是'「'字符,而不是花哨的66年代和99的是MS愛灑到處 –

+0

爲工程罰款?可能是你的'PHP_VERSION'中的一個錯誤(這是什麼?)或者嘗試'var_dump(array_map(「str_getcsv」,file($ fn)))' – mario

+0

@StefanPantke:現在你提到它了。其中一條記錄不存在,所以這是沒有被識別的換行符,因此引號被錯誤地解釋了脹。 – mario

回答

18

如果它的換行符,你可以嘗試蠻力法:

$file = file_get_contents("test.csv"); 
$data = array_map("str_getcsv", preg_split('/\r*\n+|\r+/', $file)); 
print_r($data); 

str_getcsv可用與PHP 5.3,或如在手冊中的解決方法,通過upgradephpPHP_Compat

+0

謝謝!我製作了一個解決方法$ data數組結果 – andufo

+0

非常好,這個解決了我的問題,非常感謝 – Raj

+0

非常感謝 +1也爲未知upgradephp !! – Magico

3

試試這個: -

ini_set('auto_detect_line_endings', TRUE);/// (PHP's detection of line endings) write at the top. 


$csvrows = array_map('str_getcsv', file($filepath)); 
$csvheader = array_shift($csvrows); 
$csv = array(); 
foreach ($csvrows as $row) { 
    $csv[] = array_combine($csvheader, $row); 
} 
1

試戴

$csv = array(); 

if (($file = fopen('test.csv', 'r')) === false) { 
    throw new Exception('There was an error loading the CSV file.'); 
} else { 
    while (($line = fgetcsv($file, 1000)) !== false) { 
     $csv[] = $line; 
    } 
    fclose($handle); 
}