2013-02-17 93 views
0

我想从excel文件填充我的Customer数据库,并且使用\ copy命令,但出现以下错误。任何人都可以请帮助我吗?Postgresql - 从Excel文件填充数据库

\copy customer from '/home/2008/uehtes/Desktop/Comp421/data.xlsx'; 
ERROR: invalid byte sequence for encoding "UTF8": 0xde76 
CONTEXT: COPY customer, line 1 
+1

首先将Excel工作表转储为CSV(并为正确的引用和区域设置祷告)。接下来,导入生成的.csv文件。 – wildplasser 2013-02-17 19:13:51

+0

我刚刚做了你说的话,但我面临2个问题: a)我的客户ID cid是postgesql中的一个int,但是当我从我的.csv文件复制时,我得到'整数cid无效输入语法'。这是否意味着我不得不将我的数据类型更改为我的postgresql表中的varchar?或者有没有办法在.csv文件中更改 b)我的credit_card_number属性是16个字符,但我收到一条错误消息:值太长,无法输入字符(16) 可以帮我解决这个问题吗? – ueg1990 2013-02-17 19:16:48

+0

您是否在'\ copy ...'行之前完成了'SET client_encoding = win1252;'的操作? (不确定确切的语法,请查看Fine手册)更新:你不需要varchar(16),只需使用varchar,并且大小几乎是无限的。对cid不太确定。需要更多信息。 – wildplasser 2013-02-17 19:20:58

回答

4

PostgreSQL的COPY命令和psql\copy包装它不理解或支持Microsoft Office Excel中(xls)或Microsoft Office XML电子表格(xlsx)文件格式。

您必须将Excel文件另存为CSV并使用\copy ... CSV或使用了解Microsoft Excel格式的ETL工具。以CSV格式保存是目前最简单的方法。

Excel工作表中的数据必须与您在copy中的表格的PostgreSQL列定义兼容。例如,您不能将ABC123等值复制到integer列中。

如果您的Excel数据混乱,充满无效值,并且有其他问题,请考虑先在Excel中通过添加验证将其清理干净。或者,您可以将其导入到TEMPORARYUNLOGGED PostgreSQL表中,问题列全部用text数据类型定义,然后使用INSERT INTO ... SELECT命令将清理后的数据插入到最终表中。最后的选择是再次使用像上述之一的ETL工具在数据加载和插入时清理数据。

您选择哪种方法取决于您是否更愿意使用SQL查询,使用ETL工具或使用Excel。