2016-01-09 42 views
0

這可以工作。它是一種通用的csv文件導入程序和關鍵分配程序。尋找反饋如何使這種方法更優雅。我上週開始學習php。這個論壇太棒了。輸入CSV到陣列分配鍵

<?php 
$csvfilename = "sdb.csv"; 
$filekeys = array('SSID','EquipName','EquipTypeSignalName','elecpropID'); 

$records = InputCsvFile($csvfilename,$filekeys); 

function InputCsvFile($filename,$filekeys){ 
$array1 = array_map('str_getcsv', file($filename)); 
foreach($array1 as $element){ 
    $int1 = 0; 
    unset($array3); 
    foreach($filekeys as $key){ 
    $array3[$key] = $element[$int1]; 
    $int1++;} 
    $array2[] = $array3;} 
return $array2;} 
?> 
+0

哇!更多CSV解析!今天我粘貼我的CSV解析器的鏈接(特別適用於大數據並逐行解析)。可以/你會測試它嗎? – Deep

回答

3

使用array_map()很聰明,但由於您必須進一步處理每一行,因此有些不必要。我會改寫InputCsvFile這樣的:

function InputCsvFile($filename, array $columns) { 
    $expectedCols = count($columns); 
    $arr = []; 

    // NOTE: Confirm the file actually exists before getting its contents 
    $rows = file($filename); 

    foreach($rows as $row) { 
     $row = str_getcsv($row); 

     if (count($row) == $expectedCols)) { 
      $arr[] = array_combine($filekeys, $element); 
     } else { 
      // Handle the column count mismatch. The test is required because 
      // otherwise, array_combine will complain loudly. 
     } 
    } 

    return $arr; 
} 

或者,因爲你正在處理的文件,你可以循環上fgetcsv(),而不是使用file() + str_getcsv()。使用fgetcsv()將使用更少的內存(因爲整個文件不必完全讀取並且在迭代期間保存在內存中),根據文件大小,這可能是也可能不是問題。 (順便說一句,這是PHP中我最喜歡的函數之一)創建了一個給定數組的鍵(數組中的列的列表)和值(來自csv的處理行)的新數組,並且實際上是幾乎不變的爲將csv文件轉換爲更多可用的陣列而量身定製。

+0

好點。謝謝。是的,你的方法在經過一些編輯之後起作用我很高興你向我展示瞭如何用array_combine做到這一點。我試圖讓array_combine工作,但是array_map構造了array_combine不喜歡的數組。 – VolleyballAddictSandiego