【发布时间】:2015-02-12 13:27:20
【问题描述】:
我正在使用 Informix LOAD FROM 命令将数据从 CSV 文件批量插入到数据库表中,例如:
LOAD FROM "file.csv" DELIMITER ";" INSERT INTO table_name(col1, col2, col3)
问题是,每个 CSV 文件的第一行都包含列标题。有什么方法可以告诉 Informix 第一行应该被忽略?
【问题讨论】:
我正在使用 Informix LOAD FROM 命令将数据从 CSV 文件批量插入到数据库表中,例如:
LOAD FROM "file.csv" DELIMITER ";" INSERT INTO table_name(col1, col2, col3)
问题是,每个 CSV 文件的第一行都包含列标题。有什么方法可以告诉 Informix 第一行应该被忽略?
【问题讨论】:
没有;没有办法告诉标准 Informix LOAD statement 跳过标题行。还要注意,它不会从 CSV 格式的字段周围删除引号,并且不会以 CSV 格式正式期望的方式处理事情(但是,由于您有分号分隔的值而不是逗号分隔的值,因此很难知道遵循了哪些规则——也要警惕反斜杠的处理)。
您或许可以改用 Informix DB-Load 实用程序 (dbload);这取决于您的数据是简单地使用 ; 代替 Informix 的默认 | 分隔符,还是您是否具有更多 CSV 语义,例如需要删除的字段周围的引号。如果您想获得异国情调,Informix High-Performance Loader (HPL) 可以在本地处理它,也可以经过培训来处理它。
或者,您可以考虑使用 my*SQLCMD 程序(它被称为 sqlcmd 比 Microsoft 的同名 johnny-come-lately 长得多),它允许您指定:
LOAD FROM "file.csv" DELIMITER ";" SKIP 1 INSERT INTO table_name(col1, col2, col3);
SQLCMD 还有一个选项 FORMAT CSV(以及其他格式),它可能相关,也可能不相关。它处理诸如从完整 CSV 标准支持的字段周围剥离引号之类的事情。
您需要安装 Informix ClientSDK 和 C 编译器(以及 C 开发系统的其余部分)才能构建 SQLCMD。
* 由于 SQLCMD 是我的程序,因为我编写了它,所以任何使用它的建议都存在固有的偏见;你被警告了。
您也可以考虑使用“外部表”(CREATE EXTERNAL TABLE),但我不确定它是否比 LOAD 语句更好,无论是它支持的格式还是跳过第一行数据的能力。
【讨论】:
当我使用 LOAD FROM 将 CSV 文件加载到 Informix 中时,我通常会加载到一个临时表,该表是我随后使用的所有字符列。您只需删除标题行。基本上,您只需将整个文件放入一个更易于使用的临时表中。
【讨论】: