0

我有许多 csv 文件,它们将构成 mysql 数据库的基础。我的问题如下:

输入 CSV 文件的格式为:

时间 | 值参数 1 | 价值参数 2 | 价值参数 3 | 等等。
0.00001 | 10 | 20 | 30 | 等等

这不是我想在数据库中使用的结构。在那里,我想要一个用于所有数据的大表,其结构如下:

时间 | 参数 | 价值 | 计量单位 | 版本

这意味着我想将 CSV 中的 TIME 和 VALUE PARAM 1 的组合插入到表中,然后将 TIME 和 VALUE PARAM 2 的组合插入到表中,以此类推。

我以前没有做过类似的事情,但可能的解决方案是设置一个循环遍历列并在每次迭代中将时间 + 值的组合插入到我的数据库中的 BASH 脚本?

我对 mysql 有一定的了解,但对 bash 脚本的了解非常有限。但是我找不到使用 mysql LOAD DATA INFILE 命令的方法。

如果您需要更多信息来帮助我,我很乐意提供更多信息!

问候,

埃里克

4

2 回答 2

1

我整天、每一天都这样做,而且通常情况下,通过将 LOAD DATA INFILE 用于临时表,然后利用 mySQL 的强大功能将其成功放入最终表/格式,从而获得最大的成功和最少的麻烦。此答案的详细信息。

为了进一步说明这一点,我们处理了全国 80K 高中/大学的每个视频事件的日志文件(即每一次暂停/播放/搜索/停止/开始,对于 100 的数千个视频)。

它们由许多不同的服务器提供服务,具体取决于视频的类型(WMV、FLV、MP4 等),因此每晚有大约 200GB 需要处理,每种格式都有不同的日志布局。我们使用 CSV/PHP 执行此操作的旧方法实际上需要几天时间才能完成,但将其更改为 LOAD DATA INFILE 到临时表中,将它们统一为第二个标准化临时表,然后使用 SQL 进行分组,否则会切分执行时间到几个小时。

于 2012-06-10T15:28:23.173 回答
1

首先使用脚本预处理您的 CSV 可能是最简单的awk,然后(如 Greg P 所说)使用LOAD DATA LOCAL INFILE. 如果我正确理解您的要求,这个 awk 脚本应该可以工作:

#!/usr/bin/awk -F| -f

NR==1 { 
    for(col = 2; col <= NF; col++) label[col] = $col
    printf("TIME | PARAM | VALUE | UNIT | VERSION\n")
    next 
}

{
    for(col = 2; col <= NF; col++) {
        printf("%s | %s | %s | [unit] | [version]\n", $1, label[col], $col)
    }
}

输出:

$ ./test.awk test.in
TIME | PARAM | VALUE | UNIT | VERSION
0.00001  |  VALUE PARAM 1  |  10  | [unit] | [version]
0.00001  |  VALUE PARAM 2  |  20  | [unit] | [version]
0.00001  |  VALUE PARAM 3  |  30  | [unit] | [version]
0.00001  |  ETC.   |  etc. | [unit] | [version]

然后

mysql> LOAD DATA LOCAL INFILE 'processed.csv' 
mysql> INTO TABLE 'table' 
mysql> FIELDS TERMINATED BY '|' 
mysql> IGNORE 1 LINES;

(注意:我没有测试过 MySQL)

于 2012-06-10T17:38:45.840 回答