【问题标题】:Use LOAD DATA INFILE to load two CSV files into same rows使用 LOAD DATA INFILE 将两个 CSV 文件加载到同一行中
【发布时间】:2011-01-17 06:43:43
【问题描述】:

我有两个 CSV 文件,每个文件都包含我想合并到一个数据库中的不同列。我建立了一个包含两个文件中所有列的数据库,但是当我使用 load data infile 来导入两个文件而不是合并时(IE 数据文件 1 填充列 1-6,数据文件 2 填充 7-10)我得到了一个数据库行数增加一倍(每个 CSV 中的每条记录一行)和 NULLS 填充源 CSV 中未表示的数据。

我知道我可以通过以某种方式合并 CSV、启用覆盖导入或合并数据库中的数据来解决此问题 - 对我来说最有效的方法是什么?

【问题讨论】:

    标签: mysql csv load-data-infile


    【解决方案1】:

    最好的方法是使用脚本。 CSV 导入脚本通常使用脚本语言编写,例如 python、ruby 或 php。

    您只需要第二个 CSV 的导入器对在第一个 CSV 中创建的记录执行更新,因此脚本实际上只有 5-10 行。如果您提供每个 CSV 的示例记录,我很乐意为您编写一个。

    编辑:这是一个用于组合文件的 python 脚本,在 file1 的行和 file2 的行之间添加一个分号。这基本上完成了 Linux 的 paste 命令所做的事情。

    lines1 = open('file1.txt').readlines()
    lines2 = open('file2.txt').readlines()
    outfile = open('outfile.txt', 'w')
    
    if len(lines1) != len(lines2):
        raise Exception("Files need to be the same length, but file1 is %s lines long and file2 is %s lines long" % (len(lines1), len(lines2)));
    
    for i in range(len(lines1)):
        combined = lines1[i].strip() + ";" + lines2[i].strip() + "\n"
        outfile.write(combined)
    

    您可以通过将其保存为combine.py 并输入python combine.py 来运行它。您放置它的文件夹应包含file1.txt、file2.txt 和outfile.txt。

    【讨论】:

    • 这里是每个 csv 的数据集:#1 - "Address";"State";"ZIP Code", #2 - "Office";"Contact";"ContactTitle";"Phone"
    • 它们应该在哪个字段上合并?还是它们每个都包含一个 ID 字段?
    • 每条记录有 180 条记录,每条记录完美排列
    • 好的。数据库列名称是否与"Address";"State";"ZIP Code", #2 - "Office";"Contact";"ContactTitle";"Phone" 相同?
    • 数据库列的名称略有不同,但我可以根据需要对其进行编辑。
    【解决方案2】:

    将两个 CSV 合二为一。

    如果你在linux平台,使用paste命令来连接两个或多个文件。

    粘贴(1)
    
    姓名
           粘贴 - 合并文件行
    
    概要
           粘贴 [选项]... [文件]...
    
    描述
           写入由顺序对应的行组成的行
           每个文件,由制表符分隔,到标准输出。
           没有 FILE,或者当 FILE 为 - 时,读取标准输入。
    
           多头期权的强制性参数对于空头期权也是强制性的。
    
           -d, --delimiters=LIST
                  重用 LIST 中的字符而不是 TAB
    
           -s,--串行
                  一次粘贴一个文件,而不是并行粘贴
    
           --help 显示此帮助并退出
    
            - 版本
                  输出版本信息并退出
    

    比如

    paste file1.csv file2.csv > file3.csv
    

    【讨论】:

    • 我在windows上,所以我不能用这个。 windows有没有类似的功能/实用程序?
    • 问题是他不需要垂直堆叠,而是根据id水平连接。
    • 你安装了cygwin吗?
    • @dorkitude - 您可以在 linux 中的任何特定字段上使用排序
    【解决方案3】:

    我会看看 Perl 和 Text::CSV 模块。您需要考虑的一个问题是数据在两个文件中的顺序是否相同。

    【讨论】:

      猜你喜欢
      • 2015-04-07
      • 1970-01-01
      • 1970-01-01
      • 2011-04-28
      • 2011-05-28
      • 2017-04-12
      • 2013-01-24
      • 2013-09-25
      • 2015-11-22
      相关资源
      最近更新 更多