2013-11-05 74 views
0

我想創建一個具有大型CSV文件的SQL INSERT查詢。問題是名稱沒有解析出來。因爲我區分名字和姓氏(我不關心中間名),所以他們被列爲「John Doe」或「John B Doe」而不是「John」和「Doe」。從解析CSV文件創建SQL INSERT

另一個問題是電話號碼 - 大多數被列爲「555 555 5555」,有些甚至沒有完成(「555 555」),有些是「5555555555」或「15555555555」。我甚至從哪裏開始?我做了一些谷歌搜索,並就這個具體問題做了簡短的介紹。我的語言不挑剔。不過,我最熟悉C#或PHP。我也可以用C++或BASIC完成它。我的問題實際上是從哪裏開始的。謝謝。

SQL字段:FNAME,LNAME,地址,城市,州,郵編,電話(#### - ### - ####),電子郵件

CSV例如: 「約翰·多伊中號」 ,「156 Blue St」,「Nashville」,「TN」,「23434」,「(555)555-5555」,「[email protected]

CSV示例2:「John Doe」,「156 Blue St「,」Nashville「,」TN「,」23434「,」555 555-5555「,」[email protected]

CSV示例3:」John & Jill Doe「,」156 Blue St「納什維爾「,」TN「,」23434「,」5555555555「,」[email protected]

+0

發佈csv的一些真實示例條目(涵蓋您的各種場景),併發布數據庫表結構,以及您如何期望數據(在各種情況下)出現在那裏。另外,你有什麼嘗試? –

+0

我編輯以反映您所說的話。不過,我還沒有開始。我在問從哪裏開始(參考,例子等) –

回答

0

假設您正在解析CSV以將數據導入到數據庫中,我會對中間表執行批量插入,然後在提交到真正表之前解析該表中的字段。如果您嘗試讀取CSV中的每一行並在客戶端進行解析,則最終可能會使用大量內存,並且速度會很慢,儘管有很多.net庫可幫助您執行此操作。您可以搜索TheCodePlex獲取更多信息。

下面是關於如何使用批量插入

http://technet.microsoft.com/en-us/library/ms175915.aspx

要插入表格解析成真正的表,你可以使用C#或T-SQL的鏈接。您只需根據您的規則循環並解析每個字段。可能有數百萬種方法可以做到這一點。我會開始試驗。你可能會考慮使用正則表達式:

http://regexlib.com/?AspxAutoDetectCookieSupport=1

或者

解析數字串(或這樣的事情 - 我的谷歌搜索是C#解析字符串) http://msdn.microsoft.com/en-us/library/xbtzcc4w.aspx

0

如果你想要去的php路由...

你可以使用fgetcsv解析文件一行一段時間(看文檔的例子,它顯示了打開f ile和循環每一行)。

大多數列看起來像一個簡單的事情。根據你的例子,唯一真正的問題列是姓名和電話號碼。

名稱:

一種方式來獲得姓氏和名字,而忽視中間的初始或其他任何東西是這樣的:

$name = "John Smith"; 
$name = explode(" ",$name); 
$fname = array_shift($name); 
$lname = array_pop($name); 

此不考慮你的「約翰·吉爾& Doe「的例子(會給你」John「和」Doe「),但是你將不得不在某處畫線......太過隨意了。例如,「約翰·吉爾李四」,「約翰·H·吉爾& M.李四」等。

電話號碼:處理這個是剛剛從中剝離所有非數字

最簡單的方法:

$phone = "(555) 555 555"; 
$phone = preg_replace('~[^0-9]~','',$phone); 

然後,你可以格式化你想要的。在那個筆記上..你提到的人沒有輸入足夠的數字,例如「555-5555」(沒有國家/地區代碼)或「555-555-555」(沒有國家代碼)。再說一次,關於這一點你可以做的不多,只是選擇隨機數來填補空白。我想如果你感覺真的很有雄心壯志,你可以看看第三方服務,試圖根據城市/州的價值獲得區號。但是,如果沒有,你可以從右到左解析,然後決定如何處理空白。例如,假設「5555555」確實是「555-5555」,沒有國家或地區代碼。