【问题标题】:Load text files into database merging duplicates将文本文件加载到数据库中合并重复项
【发布时间】:2013-04-06 13:24:24
【问题描述】:

我有一个 MySQL 表和大型文本文件,其中的值由制表符分隔。此文件可能包含重复项。这是一个例子:

foo \t 5
bar \t 42
etc \t 22
bar \t 50
oth \t 12

此外,每个文件可能包含与另一个文件相同的重复项。例如:

abc \t 33
foo \t 10

我想将这些文件加载​​到表中,以便合并重复的文件(对数字求和)。导入两个文件后,数据库应如下所示:

| text | num |
+------+-----+
| foo  |  15 |
| bar  |  92 |
| etc  |  22 |
| oth  |  12 |
| abc  |  33 |

这些是我已经知道的命令:

  • 加载文本文件:

    LOAD DATA INFILE "file.txt" INTO TABLE `table` FIELDS TERMINATED BY '\t';

  • 选择有重复的行:

    SELECT * FROM `table` GROUP BY `text` HAVING COUNT(*) > 1;

【问题讨论】:

    标签: mysql load duplicates sum text-files


    【解决方案1】:

    所以,我找到了实现这一目标的方法。

    创建主表:

    CREATE TABLE IF NOT EXISTS `test`
    (`text` VARCHAR(255) NOT NULL, `num` INT(11) NOT NULL);
    

    将文件加载到表中:

    LOAD DATA LOCAL INFILE 'local/path/to/file.txt'
    INTO TABLE `test` FIELDS TERMINATED BY '\t';
    

    创建一个包含重复求和数字的临时表:

    CREATE TEMPORARY TABLE `test_tmp`
    SELECT `text`,SUM(`num`) FROM `test`
    GROUP BY `text` HAVING COUNT(*) > 1;
    

    从主表中删除重复项:

    DELETE FROM `test` WHERE `text`
    IN (SELECT `text` FROM `test_tmp`);
    

    将数据复制到主表中:

    INSERT INTO `test` SELECT * FROM `test_tmp`;
    

    删除临时表:

    DROP TEMPORARY TABLE `test_tmp`;
    

    有没有更好的方法来做到这一点?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-28
      • 2013-07-19
      • 1970-01-01
      • 2015-03-20
      • 1970-01-01
      • 2019-09-12
      相关资源
      最近更新 更多