2013-12-16 107 views
0

我有一個包含用戶信息的CSV文件,說Update或CSV文件插入到SQL Server

first_name;last_name;user_id;full_name 

列分隔符是;,行終止是\n

我需要做的是插入或更新到users表。唯一的關鍵是user_id:如果與此user_id記錄已存在,我需要更新,如果它不需要插入。

但是,有一些問題阻止我使用管理工作室數據導入或bulk insert

首先,users表中有更多字段(不僅僅是4),並且csv文件中列的順序不對應表中列的順序。所以我需要能夠指定文件中的哪一列到達表中的哪一列。

其次,需要填寫一些額外的字段。例如,users.email = users.user_id。這是另一個障礙 - 雖然對於新插入的行users.email = users.user_id有可能users.email將來會改變,所以我不能只插入user_id然後運行update [users] set [email] = [user_id]

+0

你試圖使用導入數據嚮導?聽起來像您可能需要兩個階段的過程 – RoughPlace

+0

您可以做的一件事是將所有數據導入臨時表,並使用新的臨時表將「插入/更新」到目標表中。也看看[這個](http://blog.sqlauthority.com/2008/02/06/sql-server-import-csv-file-into-sql-server-using-bulk-insert-load-comma -delimited-file-into-sql-server /)和[this](http://stackoverflow.com/questions/10418461/how-to-create-and-populate-a-table-in-a-single-step -as-csv-import-oper)文章 –

+0

@Yakyb在導入數據嚮導中我無法填寫其他字段。或者我可以嗎? – xaxa

回答

0

使用fgetcsv

例子有兩個Colonne的:

<?php 
$row = 0; 
$update = ""; 
//separator of column 
$separator = ";"; 

//creates two variables containing the index columns to read/modify 
$idx_nom = 0; 
$idx_rubrique = 1; 

//Open file writing 
if (($handle = fopen("test.csv", "r")) !== FALSE) 
{ 

    //we travel the file line by line, storing the data in a table 
    while (($data = fgetcsv($handle, 1000, ";")) !== FALSE) 
    { 
     //can not control that the second line if the first contains the column headers 
     if ($row != 0) 
     { 
      //conditions of one column 
      if (stristr($data[$idx_nom], 'chemise')) 
      { 
      $data[$idx_rubrique] = 1; 
      } 
      else if (stristr($data[$idx_nom], 'costume')) 
      { 
      $data[$idx_rubrique] = 2; 
      } 
      else if (stristr($data[$idx_nom], 'cravate')) 
      { 
      $data[$idx_rubrique] = 3; 
      } 
     } 

     $update .= implode($separator,$data)."\r\n"; 
     $row++; 
    } 

    fclose($handle); 
} 

//update from csv 
$ouvre=fopen("test.csv","w+"); 
fwrite($ouvre,$update); 
fclose($ouvre); 
?>