2012-07-12 66 views
5

我有了一堆格式數據中有一個txt文件,看起來像以下:加載固定寬度,空間分隔的.txt文件到MySQL

... 
    1  75175.18  95128.46 
    1 790890.89 795829.16 
    1 875975.98 880914.25 
    8 2137704.37 2162195.53 
    8 2167267.27 2375275.28 
    10 2375408.74 2763997.33 
    14 2764264.26 2804437.77 
    15 2804504.50 2881981.98 
    16 2882048.72 2887921.25 
    16 2993093.09 2998031.36 
    19 3004104.10 3008041.37 
... 

我試圖加載的每一行作爲我的數據庫中的表中的一個條目,其中每列是不同的字段。我無法讓MySQL正確分離所有數據。我認爲這個問題來自於這樣一個事實,即並不是所有的數字都用等距的空白量來分隔。

這裏有兩個查詢至今(我也嘗試過這些查詢的幾種變體),我曾嘗試:

LOAD DATA LOCAL INFILE 
'/some/Path/segmentation.txt' 
INTO TABLE clip (slideNum, startTime, endTime) 
SET presID = 1; 


LOAD DATA LOCAL INFILE 
'/some/Path/segmentation.txt' 
INTO TABLE clip 
FIELDS TERMINATED BY ' ' 
LINES TERMINATED BY '\n' 
(slideNum, startTime, endTime) 
SET presID = 1; 

任何想法如何得到這個工作?

+0

另外,注意在每一行的開始處的單個空格。 – bddicken 2012-07-12 22:42:34

回答

10

這些就是我們所說的「固定寬度」記錄,並且LOAD DATA不能很好地與它們配合使用。選項:

  1. 在Excel中清理數據第一,或
  2. 加載了數據到一個臨時表只有1列,順手把整個文本行插入到該列。然後,您可以使用SUBSTR()TRIM()將您需要的列切出到最終表格中。
  3. 或者使用用戶變量(@row),您可以在LOAD DATA語句中完成所有操作。
LOAD DATA LOCAL INFILE 
'/some/Path/segmentation.txt' 
INTO TABLE clip 
(@row) 
SET slideNum = TRIM(SUBSTR(@row,1,4)), 
    startTime = TRIM(SUBSTR(@row,5,13)), 
    endTime = TRIM(SUBSTR(@row,18,13)) 
; 
+0

好的,很酷。如果每個值之間只有一個空格,這個查詢會更好嗎?編寫腳本使間距更加一致可能並不困難。 – bddicken 2012-07-12 23:01:31

+0

通常,您應該使用逗號,分號,製表符或管道('|')來分隔文本文件中的字段(CSV =逗號分隔值是最常見的格式)。然後LOAD DATA可以輕鬆處理它們。 – 2012-07-12 23:06:14

+0

哇,選項3(以及與之相關的查詢)完美地工作,謝謝! – bddicken 2012-07-12 23:25:18

0
LOAD DATA 
CHARACTERSET AL32UTF8 
INFILE 'DCF Master 14APR2013 VSPCFM_reduced size.txt' 
INTO TABLE EMPLOYEE3 
(
a = TRIM(SUBSTR(@row,1,11)), 
b = TRIM(SUBSTR(@row,33,38)), 
c = TRIM(SUBSTR(@row,70,86)) 
)