有选择地使用外部文件加载数据INFILE

时间:2013-01-28 23:00:07

标签: mysql linux unix find

我在以下结构中有一个名为/tmp/files.txt的文件:

652083        8 -rw-r--r--    1 david            staff                1055 Mar 15  2012 ./Highstock-1.1.5/examples/scrollbar-disabled/index.htm
652088        0 drwxr-xr-x    3 david            staff                 102 May 31  2012 ./Highstock-1.1.5/examples/spline
652089        8 -rw-r--r--    1 david            staff                1087 Mar 15  2012 ./Highstock-1.1.5/examples/spline/index.htm
652074        0 drwxr-xr-x    3 david            staff                 102 May 31  2012 ./Highstock-1.1.5/examples/step-line
652075        8 -rw-r--r--    1 david            staff                1103 Mar 15  2012 ./Highstock-1.1.5/examples/step-line/index.htm

我想将文件名(col 9),filesize(col 7)和last_modified(col 8)插入mysql表paths

要插入整行,我可以执行以下操作:

LOAD DATA INFILE '/tmp/files.txt' INTO TABLE path 

如何在此处有选择地将所需信息插入必要的列?

1 个答案:

答案 0 :(得分:1)

指定虚拟MySQL用户变量(例如@ dummy1)作为不需要的值的目标。

LOAD DATA INFILE '/tmp/files.txt'
INTO TABLE path 
(@d1, @d2, @d3, @d4, @d5, @d6, filesize, @mon, @day, @ccyy_or_hhmi, filename)
SET last_modified = CONCAT(@mon,' ',@day,' ',@ccyy_or_hhmi)

这样,输入行的前六个值将被忽略(这些值被分配给指定的用户变量,我们忽略它们。)第七个值被分配给filesize列,第八个到第十个值(将月份日和年份/时间分配给用户变量,然后将第11个值分配给filename列。

最后,我们使用表达式将月,日和年/时间值连接在一起,并将其分配给last_modified列。 (注意:结果字符串不保证适合分配给DATE或DATETIME列,因为最后一个值可以是一年,也可以是一个时间。)

(我假设表path包含名为filesize,last_modified和filename的列,并且表中没有其他列需要设置。)


跟进

如果要加载的数据是find命令的输出,我很想使用find的-printf动作,而不是-ls,所以我可以控制生成的输出。例如:

find . -type f -printf "%b\t%TY-%Tm-%Td %TH:%TM\t%p\n" >/tmp/myfiles.txt

这会给你三个字段,用制表符分隔:

size_in_blocks   modified_yyyy_mm_dd_hh_mi  filename

这很容易加载到MySQL表中:

LOAD DATA INFILE '/tmp/myfiles.txt'
INTO TABLE path
(filesize, last_modified, filename)