2010-06-17 45 views
2

我正在尋找一個如何在一個表的字段中拆分逗號分隔數據的示例,並填寫第二個表中包含這些單個元素,以便創建一對多的關係數據庫模式。這可能是很簡單,但讓我舉一個例子:PHP或C#腳本來解析CSV表值來填寫一對多表

我會在一個表中的一切開始,小工具,其中有一個「狀態」字段包含有狀態插件:

表:WIDGET

=============================== 
| id | unit | states   | 
=============================== 
|1 | abc | AL,AK,CA  | 
------------------------------- 
|2 | lmn | VA,NC,SC,GA,FL | 
------------------------------- 
|3 | xyz | KY    | 
=============================== 

現在,我想通過代碼來創建要加入到小部件稱爲Widget_ST第二臺具有控件ID,控件狀態ID,和widget州名領域,例如mple

表:WIDGET_ST

============================== 
| w_id | w_st_id | w_st_name | 
------------------------------ 
|1  | 1  | AL  | 
|1  | 2  | AK  | 
|1  | 3  | CA  | 
|2  | 1  | VA  | 
|2  | 2  | NC  | 
|2  | 1  | SC  | 
|2  | 2  | GA  | 
|2  | 1  | FL  | 
|3  | 1  | KY  | 
============================== 

我學習C#和PHP,所以在任何一種語言的反應將是巨大的。

謝謝。

回答

3

我寫了一些腳本來將堆棧溢出數據轉儲導入SQL數據庫。我將標籤分成列表,按照您的描述填充多對多表。我用類似以下的技術:

  1. 從WIDGET讀取一行

    while ($row = $pdoStmt->fetch()) { 
    
  2. 使用explode()拆就逗號

    $states = explode(",", $row["state"]); 
    
  3. 遍歷元素,寫入新的CSV文件

    $stateid = array(); 
    $stfile = fopen("states.csv", "w+"); 
    $mmfile = fopen("manytomany.csv", "w+"); 
    $i = 0; 
    foreach ($state as $st) { 
        if (!array_key_exists($st, $stateid)) { 
         $stateid[$st] = ++$i; 
         fprintf($stfile, "%d,%s\n", $i, $st); 
        } 
        fprintf($mmfile, "%s,%s\n", $row["id"], $stateid[$st]); 
    } 
    fclose($stfile); 
    fclose($mmfile); 
    
  4. 完成後,將CSV文件加載到數據庫中。你可以在MySQL客戶端做到這一點:

    mysql> LOAD DATA INFILE 'states.csv' INTO TABLE STATES; 
    mysql> LOAD DATA INFILE 'manytomany.csv' INTO TABLE WIDGET_ST; 
    

它可能看起來像很多工作,但使用LOAD DATA命令的運行速度比在一次插入一行快20倍,因此,如果你是值得的數據集很大。


回覆您的評論:

權利,我也有數據庫中的數據了。事實證明,我上面顯示的解決方案,轉儲到CSV文件並以標準化格式重新導入,比在分割數據的循環內執行INSERT語句快

每個品牌的數據庫都有自己的導入批量數據的工具。請參閱我對Optimizing big import in PHP的回答,以獲取每個數據庫批量導入解決方案的列表。

您應該使用每個數據庫提供的工具。試圖保持跨平臺只使您的代碼Jack of all trades, master of none。此外,在90%的情況下,當人們向後彎曲以使其代碼數據庫無關時,事實證明它們從不使用多個數據庫。無論如何,你無法實現完全的數據庫獨立性。

+0

我會給你一點 - 但我也在尋找更「跨平臺」的東西,因爲我的數據庫管理系統可能是SQL Server 2008或Postgres等。我也已經有了數據庫中的原始表格式,我試圖通過根據需要使用更多的關係來更新它。非常感謝 – Yaaqov 2010-06-17 17:12:56