使用python将整个文本文件加载到数据库中

Posted

技术标签:

【中文标题】使用python将整个文本文件加载到数据库中【英文标题】:Load entire text file in database using python 【发布时间】:2015-02-16 07:06:01 【问题描述】:

我想将具有由分隔符 || 分隔的两个字段的整个文本文件加载到我的 netezza 数据库中。 由于数据集很大,因此每行插入每个 n 会降低我的性能。

我的文本文件是这样的:

ING BANK, N.V.||520639
STANDARD CHARTERED BANK MALAYSIA BERHAD||483551
VJA||492287

您能否帮助建议我如何一次将我的文件上传到数据库中?

谢谢。

【问题讨论】:

我尝试使用 LOAD DATA INFILE 但抛出错误。回溯(最近一次调用最后一次):文件“”,第 1 行,在 curs.execute(sql ) ProgrammingError: ('42000', '[42000] ERROR: \'LOAD DATA INFILE \'bankdata.TXT\'\n INTO TABLE INS_EDW_QA.dbo.BNK_CDE_TEST\n FIELDS TERMINATED BY \'||\'\n LINES TERMINATED BY \'\n\'\'\nerror ^ 发现“DATA”(在字符 6 处)期望 `SCONST\' (27) (SQLExecDirectW)') 您能否建议这里有什么问题或建议其他方法来一次性加载文件? 您似乎正在使用 mysql 加载语法,但据我了解,您正试图将数据加载到 Netezza 中?您是在 Netezza 服务器上本地运行 python 脚本,还是通过 ODBC 连接远程运行它? 我通过 pyodbc 连接到 netezza。使用此代码进行连接,conn = pyodbc.connect(dsn='NZSQL')。我在本地运行 python 2.7。 【参考方案1】:

如果您通过 ODBC 连接远程将数据加载到 Netezza,您可以使用以下语句作为模板。在其中,我通过通用 SQL 开发工具使用 ODBC 连接从本地的文本文件加载到我的 Windows 工作站。

INSERT INTO BNK_CDE_TEST
SELECT *
FROM external 'c:\bankdata.TXT'
USING (DELIMITER '|' REMOTESOURCE 'ODBC');

请务必注意,Netezza 不支持多字符列分隔符。您要么需要预处理数据以转换您的“||”分隔符到别的东西,或者你需要执行一个像下面我们使用'|'的技巧作为分隔符,因此 '||'被视为垃圾空列周围的两个分隔符。

INSERT INTO BNK_CDE_TEST
SELECT COL1,   COL2
FROM external 'c:\bankdata.TXT' (COL1 VARCHAR(100), junkcol INT, col2 bigint)
USING (DELIMITER '|' REMOTESOURCE 'ODBC');

【讨论】:

非常感谢。信息真的很有帮助。我将分隔符更改为“|”并尝试运行第一个命令。我收到此错误:错误:('HY000','[HY000] 打开数据文件(38)(SQLExecDirectW)时发生错误')。请提出这里有什么问题。 这表明“FROM EXTERNAL...”后面的路径在某些方面不正确。查看您上面的评论,您可能正在使用相对路径。以这种方式加载需要完整的路径规范。此外,由于双定界符“||”,我给出的第一个示例可能不适用于您的特定情况。对于您的测试,我会说尝试使用完整路径的答案中的第二个。

以上是关于使用python将整个文本文件加载到数据库中的主要内容,如果未能解决你的问题,请参考以下文章

python 以块的形式读取文件而不将整个文件加载到内存中。

通过python UDF将文本文件导入pig

如何从文本文件中读取/加载此HashMap?

使用 Delphi 将文本文件加载到 MS ACCESS TABLE

通过消除重复将数据从文本文件加载到mysql数据库

oracle 将文本文件中的数据加载到表中