我在以下结构中有一个名为/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
如何在此处有选择地将所需信息插入必要的列?
答案 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)