2013-09-01 98 views
3

在MySQL中,我們可以導入數據文件 -mysql可以將csv或其他txt文件導入一列嗎?

load data infile 'file.txt' 
into table `text` 
fields terminated ' ' 
lines terminated '\n' 

我的問題是,我們能與進口未知列的文件全部合併到一列?或者我們可以創建我們需要的列嗎?

回答

1

我們可以將一個未知列的文件全部導入到一列嗎?

是的,你可以做以下幾個步驟:

首先創建一個臨時分段表(可以稱之爲import)與一列,將舉行線作爲源數據文件的行

從文件
CREATE TABLE `import` (
    `line` varchar(512) DEFAULT NULL 
); 

和加載數據到表

LOAD DATA INFILE '/path/to/your/file.txt' 
INTO TABLE import 
FIELDS TERMINATED BY '\n' 
LINES TERMINATED BY '\n' 

假設你有一個目標表(讓我們稱之爲它words),看起來像這樣

CREATE TABLE `words` (
    `word` varchar(64) DEFAULT NULL 
); 

我們可以每行拆分成詞並將其插入到words表查詢

INSERT INTO words (word) 
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(line, ' ', n.n), ' ', -1) word 
    FROM import CROSS JOIN 
(
    SELECT a.N + b.N * 10 + 1 n 
    FROM 
    (SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) a 
    ,(SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) b 
    ORDER BY n 
) n 
WHERE n.n <= 1 + (LENGTH(line) - LENGTH(REPLACE(line, ' ', ''))) 
ORDER BY n.n 

注:

  • 假設是你的話分離Ë與一個空間xactly
  • 此查詢將分裂爲100個單詞。如果您需要更多或更少,則可以通過編輯內部子查詢來調整限制,或者如果定期導入,則應考慮使用持久性計數(數字)表來代替。

刪除或截斷(如果你將再次使用它來導入多個文件)的臨時表

DROP TABLE import; 

這裏是SQLFiddle演示顯示兩個步驟。

+0

這不起作用,因爲我希望分隔符是單個空格,當我們不知道每行有多少單詞時,問題就會出現。這種方法將讀入整行,而不是逐字讀入一列。 –

+0

@DerekCarr你應該已經提到,* ...逐字逐列成一列... *。沒有它,你的實際意圖不明確。 – peterm

+0

@DerekCarr查看可能的解決方案的更新答案 – peterm

相關問題