2012-02-25 95 views
-2

我有許多單獨的文本文件,我想將其導入到SQL數據庫中。數據不是以逗號分隔的,因此排除了使用我用逗號導入數據的想法。但是,數據跨越多行。見下面的示例文本文件。請任何人都可以告訴我如何導入特定的數據,如程序和平均值,班次數等?將文本文件導入到SQL數據庫中

enter image description here

回答

-1

你可以寫在C#中的簡單應用程序來解析使用正則表達式的文件的內容,把它變成一條線,並在需要插入分號。

0

它看起來像你有一個機器生成的報告。理想的方法是讓該機器生成一個不同的報告 - 一個沒有「/////」或任何廢話,只是你想要導入的數據。因此,新報告的輸出可能如下所示。

shift_num, prog_min, mean_sec, att_sec, adt_min 
1, 600, 599, 658, 210 
... 

實際上,通常不可能得到那樣的報告。 (也就是說,它總是可能會讓機器執行此操作,但人們往往不願意這樣做。)發生這種情況時,請使用您最喜愛的文本處理語言將報告轉換爲可用數據。

我喜歡這種東西的awk。其他人喜歡perl。


爲了說明這一點,我在這個報告的副本中輸入了關鍵字。 (保存爲test.dat)

ORDER Nr FG68909     Q.ty Ordered 99 
... 
             SHIFT Nr. 1 

//////// 
PROGRAMMED       MEAN 

600 min      JOB TIME  599 sec 




AVERAGE Turnaround Time 658 sec 
AVERAGE Delivery Time 210 mins 

然後我寫了這個awk程序。它對報告的佈局做了很多假設。其中一些可能會在真實數據上失敗。

/SHIFT/ {shift = $NF} 
/JOB TIME/ { 
    programmed = sprintf("%d %s", $1, $2); 
    mean = sprintf("%d %s", $(NF-1), $NF); 
} 
/AVERAGE Turnaround/ { avg_turnaround = sprintf("%d %s", $(NF-1), $NF);} 

# Assumes the line "AVERAGE Delivery" is also the end of the record. 
/AVERAGE Delivery/ { 
    avg_delivery = sprintf("%d %s", $(NF-1), $NF); 
    printf("%d, '%s', '%s', '%s', '%s'\n", shift, programmed, mean, avg_turnaround, avg_delivery); 
    # Clear the vars for the next record. 
    shift = ""; 
    programmed = ""; 
    mean = ""; 
    avg_turnaround = ""; 
    avg_delivery = ""; 
} 

輸出。 。 。

$ awk -f test.awk test.dat 
1, '600 min', '599 sec', '658 sec', '210 mins' 
+0

你知道你可以使用逗號導入數據,是否有通過查看空格數量或固定長度導入數據的事情? – Blob 2012-02-27 10:52:40

+0

是的,* I *可以導入固定寬度的數據,我相信OP可以導入固定寬度的數據。但他沒有固定寬度的數據。他有一個已被保存到文件的報告。 – 2012-02-27 11:08:22

+0

你好,我還在爲這個而苦苦掙扎,並且研究過AWK和AWKA,但還是輸了。我只是想知道是否有任何教程或更簡單的方法從每個文本文件中提取特定的數據?謝謝 – Blob 2012-03-20 09:57:21

相關問題