【问题标题】:LOAD DATA INFILE selectively with external file选择性地使用外部文件加载数据
【发布时间】:2013-01-28 23:00:06
【问题描述】:

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

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

【问题讨论】:

    标签: mysql linux unix find


    【解决方案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 命令的输出,我会很想使用 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)
    

    【讨论】:

    • 谢谢,虽然当使用上面的它给我一个完全空的输出。我拥有的文件是来自'find . -ls' 的管道。
    • 它似乎没有在 ls 命令中使用的制表符/空格上分开。
    • @David542:作为一种选择,您可以将空格转换为制表符。一种方法是在 MySQL LOAD DATA 语句读取输出之前通过tr -s ' ' | tr ' ' '\t' 管道输出。如果您可以控制该 find 命令,则更好的选择是使用 -printf 操作而不是 -ls 操作,这样您就可以指定生成的输出格式。 (在上面的回答中添加了后续内容。)
    • 感谢更新的答案,但不幸的是我使用的是 Mac,它无法识别 find 命令中的 -printf 选项。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-07
    • 1970-01-01
    • 2017-08-27
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多