2013-09-01 112 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

相关问题