0

我有一个名为/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

我想将文件名(第 9 列)、文件大小(第 7 列)和 last_modified(第 8 列)插入到 mysql 表中,paths.

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

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

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

4

1 回答 1

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列,第八个到第十个值(月日和年/将时间分配给用户变量,然后将第十一个值分配给filename列。

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

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


跟进

如果要加载的数据是 find 命令的输出,我会很想使用-printffind 的动作,而不是-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)
于 2013-01-28T23:08:03.280 回答