将多个文件中的多条记录加载到mysql表中

将多个文件中的多条记录加载到mysql表中,mysql,ruby,Mysql,Ruby,我正在尝试将不同文件中的不同数据加载到MySQL的多个列中。我不是一个数据库高手,所以我的数据结构可能有误。:) 我是这样设置的: DATABASE: mydb TABLE: aixserver1 COLUMNS: os, hostname, num_users, num_groups, pkg_epoch shown from mysql: +---------------+-----------+------+-----+-------------------+---------

我正在尝试将不同文件中的不同数据加载到MySQL的多个列中。我不是一个数据库高手,所以我的数据结构可能有误。:)

我是这样设置的:

DATABASE: mydb
TABLE:    aixserver1
COLUMNS:  os, hostname, num_users, num_groups, pkg_epoch

shown from mysql:

+---------------+-----------+------+-----+-------------------+----------------+
| Field         | Type      | Null | Key | Default           | Extra          |
+---------------+-----------+------+-----+-------------------+----------------+
| id            | int(11)   | NO   | PRI | NULL              | auto_increment |
| cur_timestamp | timestamp | NO   |     | CURRENT_TIMESTAMP |                |
| pkg_epoch     | int(11)   | NO   |     | NULL              |                |
| os            | char(5)   | YES  |     | NULL              |                |
| hostname      | char(40)  | YES  |     | NULL              |                |
| num_users     | int(10)   | YES  |     | NULL              |                |
| num_groups    | int(10)   | YES  |     | NULL              |                |
+---------------+-----------+------+-----+-------------------+----------------+
所以基本上我想将pkg_epoch、os、hostname、num_用户和num_组填充到数据库中。我要加载的数据在服务器上的5个平面文件中。我正在使用ruby加载数据

我的问题是如何将这些文件中的所有值一次加载到表中。如果我一次插入一条,那么其他记录将变为空。也就是说,我只将数据加载到hostname列中,而该行的所有其他列都变为NULL


我错过了什么?:)

您可以通过几种方法来实现这一点,但诀窍是使用变量占位符。以下是使用数据库的加载数据功能的示例:

LOAD DATA INFILE '/PATH/TO/FILE' IGNORE INTO TABLE tableName FIELDS TERMINATED BY '\t' LINES  
TERMINATED BY '\r' (@skip, @skip, @skip, login_name, pwd, @skip, @skip, @skip, @skip, @skip, first_name, last_name);
你看,我只是为我不想包含在数据库中的字段设置了一个变量@skip或@anywhere,并为我想要的列命名



我可以让你半途而废,但我不确定最好的方法,如果你用Ruby构建自己的加载程序。我建议您检索该文件,并让MySQL使用加载数据导入,因为这将非常有效,您可以使用上面的技巧。

您的插入查询是什么样子的?显示您用于获取文件数据和插入db
insert-into-test(pkg_-epoch、os、hostname、num_-users、num_-groups)值('324234236','linux','testos','51','90')的ruby代码插入有效。。但我将从一个文件中加载这些值。我只是在mysql命令提示符中输入了它。加。。现在才五点开始。当我做完这件事的时候,我可以插入20-50件东西。因此,我不认为只解析文件中的数据,然后执行一个巨大的insert语句就可以了。注意,我的示例假设文件是以制表符分隔的“\t”,但您可能有固定的宽度或逗号分隔符,因此您将进行相应的调整。还有一些字符集可能需要用“\r\n”分隔行,但“\r”应该可以。嗯,我想我不明白。我试图加载的文件只有一个值。所以我有5个文件,5个不同的列有5个值。一个名为“os”的文件在名为“AIX”的文件中只有一行。另一个名为“hostname”的文件在名为“aixtest”的文件中只有一行。我正试图将两个文件加载到一个表中的一行中。啊,我明白你的意思了。不知怎的,我读到了相反的内容,文件中包含了更多您需要的列。有多种“极客”方式可以通过unix命令来实现,首先合并/分隔文件,但前提是每一行都匹配。如果每个文件中只有一个值,是否假设每一行都与其他文件中的行完全匹配?是的。基本上,我所做的是跟踪服务器上的用户数、组数、主机名和操作系统。我通过shell脚本收集数据,并将其scping到mysql服务器。它们都在不同的文件中。所以我猜没有简单的方法可以做到。。我应该合并文件并像那样加载它。我唯一的另一个想法是将每个文件加载到一个临时表中,然后将它们连接起来,以便所有值都显示在主表的同一行中。我知道数据是正确的,我只需要它们都显示在同一行中。您的数据库定义也让它成为一个挑战,因为您看到其中有非空字段,所以您不能只插入一个值为一行,而其他值为空。我认为最好的办法是在加载到DB之前先使用脚本合并文件。我希望我能在这方面帮助你,但我知道Linux很危险。一个带有SED命令的狡猾的shell脚本,我打赌你可以完成它,然后使用我的示例加载数据(如果你按照你的规范构建文件,最有可能没有@skip)。