2014-02-19 42 views
0

我遇到了將csv插入數據庫的問題。這裏是我的CSV內容示例:將CSV內容保存到mysql數據庫中

gender,age,name,location 
male,21,jayvz,spl 
female,21,jacyn,srl 

和這裏的表的表結構:

  • ID(自動遞增)
  • CONTACT_ID
  • 標籤

我需要做的是將數據從csv插入到ta中竹葉提取這樣的:
預期輸出:

id | contact_id | label | value 
1 |  1  | gender | male 
2 |  1  | age  | 21 
3 |  1  | name  | jayvz 
4 |  1  | location | spl 
5 |  2  | gender | female 
6 |  2  | age  | 21 
7 |  2  | name  | jacyn 
8 |  2  | location | srl 

(遺憾的預期輸出)

什麼想法?或者這甚至有可能?

CODE:

$headers = exec("head -n 1 {$paramfile}"); 
$param_names = array_filter(explode(",", $headers)); 
$param_count = count($param_names); 

$contact_count = count($contacts); 

$contactsfile = getcwd()."/uploads/".date('ymdhis').".cntctid"; 
$row = ''; 
$str_csv = array(); 

$tmp_handler = fopen($datafile, 'r'); 
$param_value = ''; 

while(($upload_str = fgets($tmp_handler, 4096)) !== FALSE){ 
    $param_value = explode(",", $upload_str); 
    array_shift($param_value); // msisdn bb 
    $str_line = implode(",", $param_value); 
    //$age = array_shift($param_value); 

    //$row.= implode(",", $param_value); 
    //for($x = 0; $x < count($param_value); ++$x){ 
    // $row.= $param_value[$x].","; 
    //} 

    $str_csv[] = str_getcsv($str_line, ","); 
} 
for($a = 0; $a < $param_count; ++$a){ 
for($i = 0; $i < $contact_count; ++$i){ 
$row = $contacts[$i].",".$param_names[$a].",'<the values should be here>'"; 
exec("echo '".$row."' >> ".$contactsfile); 
} 
} 

$load_query = "LOAD DATA LOCAL INFILE '{$contactsfile}' INTO TABLE {$this->contact_details} "; 
$load_query .= "FIELDS TERMINATED BY ',' LINES TERMINATED BY '\\n' "; 
$load_query .= "(contact_id, label_name, label_value)"; 

$this->db->query($load_query); 

return $this->db->affected_rows() > 0; 
+0

顯示您的代碼.... –

+0

[我怎樣才能將數據從CSV導入到MySQL?](http://stackoverflow.com/questions/9555370/how-i-can-import-data -from-csv-to-mysql) – randak

+0

可能幾乎就是一切。請發佈您的代碼到目前爲止。 –

回答

2

試試這個:

$row = 1; 
$labels = array(); 
if (($handle = fopen("your.csv", "r")) !== FALSE) { 
    while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) { 
     if($row==1){ 
      $labels = $data; 
     } else { 
      foreach ($data as $key=>$value) { 
       $query = "insert into table values (null,$row,'{$labels[$key]}','$value')"; 
       $this->db->query($query) 
      } 
     } 
     $row++; 
    } 
    fclose($handle); 
} 
+0

每一行插入一種方法,也適用於巨大的CSV文件,但如果您的CSV數據總是足夠小以適應內存,我會設置一個值數組並在該循環之後插入一次。 – feeela

+0

我會使用非常大量的csv文件數據(例如,500k到1m行或更多) –

+0

感謝@HarryFink爲您的想法。但是我需要執行算法而不會耗盡我的記憶 –

1

爲什麼不使用PHP解析它適合你?更多的控制,更少擔心海事組織。

要做到這一點,你會把它分成幾行,然後把行分成幾個字段。下面假設你有一個字符串變量可用的CSV,並且CSV是要與解析它在同一系統上創建了(因爲我使用PHP_EOL常數)

$csv 

$lines = explode(PHP_EOL, $csv); 

$load_query = "INSERT INTO table_name (contact, label, value) VALUES "; 

for($i = 1 ; $i < count($lines) ; $i++){ 
    // Split the line into fields 
    $fields = $explode(",", $lines[$i]); 
    // Concatenate the insert values 
    $load_query .= "({$field[0]},{$field[1]},{$field[2]})"; 
    // If there are more lines add a comma 
    if($i < (count($lines)-1)){ 
     $load_query .= ","; 
    } 
} 
// Run the query and return 
$this->db->query($load_query); 
return $this->db->affected_rows() > 0; 

這些字段應該真的被消毒或什麼的。

+0

感謝@ h.caotes您的想法 –

0

這個問題解決了,我寫數據到一個CSV文件格式

1,年齡21 1名,jayvz 1,位置,SPL 2,年齡21 2,名,jacyn 2,位置,SRL

然後我用了MySQL的加載本地INFILE查詢,以防止內存耗盡性和非常大的文件,我使用的是bash腳本的「分裂」

把它分成多個文件成爲了可能

感謝球員爲想法。 =)

相關問題