将Excel数据导入PostgreSQL 9.3

gre*_*een 27 sql postgresql excel

我在excel中开发了一个庞大的表,现在面临将其转移到postgresql数据库的问题.我已经下载了odbc软件,我可以用excel打开在postgresql中创建的表.但是,我无法以相反的方式执行此操作,即在Excel中创建表并在postgresql中打开它.所以我想知道它可以通过这种方式完成,或者是否有任何替代方法可以创建一个带有pgAdmin III的大表,因为原始插入数据是非常繁琐的.

在此先感谢您的所有帮助!

Chr*_*ers 33

典型的答案是这样的:

  1. 在Excel,文件/另存为中,选择CSV,保存当前工作表.

  2. 转移到postgres用户可以访问的Pg服务器上的保留目录

  3. 在PostgreSQL中:

    COPY mytable FROM '/path/to/csv/file' WITH CSV HEADER; -- must be superuser
    
    Run Code Online (Sandbox Code Playgroud)

但是还有其他方法可以做到这一点.PostgreSQL是一个令人惊讶的可编程数据库.这些包括:

  1. 用pl/javaU,pl/perlU或其他不受信任的语言编写模块来访问文件,解析它并管理结构.

  2. 使用CSV和fdw_file将其作为伪表进行访问

  3. 使用DBILink和DBD :: Excel

  4. 编写自己的外部数据包装器以读取Excel文件.

可能性几乎无穷无尽......


ale*_*sky 5

您还可以使用psql控制台执行\ copy而无需将文件发送到Postgresql服务器计算机.命令是一样的:

\copy mytable [ ( column_list ) ] FROM '/path/to/csv/file' WITH CSV HEADER
Run Code Online (Sandbox Code Playgroud)


say*_*yth 5

对于python,您可以将openpyxl用于所有2010年及更新版本的文件格式(xlsx)。

Al Sweigart拥有完整的教程,该教程从自动化无聊的部分到处理excel电子表格的工作非常深入,整本书和随附的Udemy课程都是不错的资源。

从他的榜样

>>> import openpyxl
>>> wb = openpyxl.load_workbook('example.xlsx')
>>> wb.get_sheet_names()
['Sheet1', 'Sheet2', 'Sheet3']
>>> sheet = wb.get_sheet_by_name('Sheet3')
>>> sheet
<Worksheet "Sheet3">
Run Code Online (Sandbox Code Playgroud)

可以理解的是,一旦获得此访问权限,您现在就可以像通常那样使用psycopg将数据解析为postgres了。

这是python-excel上python资源列表的链接,而且xlwings提供了许多功能来使用python代替excel中的vba。


Ben*_*Ben 5

正如这里所解释的http://www.postgresonline.com/journal/categories/journal/archives/339-OGR-foreign-data-wrapper-on-Windows-first-taste.html

使用ogr_fdw模块,可以在pgsql中将excel工作表作为外部表打开,并像pgsql中的任何其他常规表一样直接查询它。这对于从同一个定期更新的表中读取数据非常有用

为此,电子表格中的表头必须是干净的,当前的 ogr_fdw 驱动程序无法处理宽字符或换行符等。使用这些字符,您可能无法引用 pgsql 中的列,因为编码问题。(我无法使用这个美妙的扩展的主要原因。)

适用于 Windows 的 ogr_fdw 预构建二进制文件位于此处http://winnie.postgis.net/download/windows/pg96/buildbot/extras/ 更改链接中的版本号以下载相应的版本。将文件解压到 pgsql 文件夹以覆盖同名子文件夹。重新启动 pgsql。在测试驱动之前,需要通过执行以下命令来安装模块:

CREATE EXTENSION ogr_fdw;
Run Code Online (Sandbox Code Playgroud)

简要用法:

  1. 使用 ogr_fdw_info.exe 探测 Excel 文件中的工作表名称列表

    ogr_fdw_info -s "C:/excel.xlsx"
    
    Run Code Online (Sandbox Code Playgroud)
  2. 使用“ogr_fdw_info.exe -l”来探测单个工作表并生成表定义代码。

    ogr_fdw_info -s "C:/excel.xlsx" -l "sheetname"
    
    Run Code Online (Sandbox Code Playgroud)

在 pgsql 中执行生成的定义代码,创建一个外部表并将其映射到您的 Excel 文件。可以像普通表一样进行查询。

如果您有许多具有相同表结构的小文件,这尤其有用。只需更改定义中的路径和名称,然后更新定义就足够了。

该插件支持 XLSX 和 XLS 文件。根据该文档,也可以将数据写回到电子表格文件中,但 Excel 中的所有精美格式都将丢失,文件会在写入时重新创建。

如果excel文件很大。这是行不通的。这是我没有使用此扩展的另一个原因。它一次性加载数据。但是这个扩展也支持 ODBC 接口,应该可以使用 Windows 的 ODBC excel 文件驱动程序为 excel 文件创建 ODBC 源,并使用 ogr_fdw 或任何其他 pgsql 的 ODBC 外部数据包装器来查询这个中间 ODBC 源。这应该是相当稳定的。

缺点是您无法像之前的方法一样在 pgsql 中轻松更改文件位置或名称。

友情提醒。权限问题适用于此 fdw 扩展。因为它加载到 pgsql 服务中。pgsql 必须具有 Excel 文件的访问权限。


Mik*_*e T 5

我使用的一种方法是将表作为 a加载到Rdata.frame,然后用于dbWriteTable将其推送到 PostgreSQL。这两个步骤如下所示。

将 Excel 数据加载到 R

Rdata.frame对象类似于数据库,其中命名列具有显式类型,例如文本或数字。有多种方法可以将电子表格导入R,例如XLConnect。但是,一个非常简单的方法是选择 Excel 表格的范围(包括标题),将其复制(即CTRL+ C),然后在R 中使用此命令从剪贴板中获取它:

d <- read.table("clipboard", header=TRUE, sep="\t", quote="\"", na.strings="", as.is=TRUE)
Run Code Online (Sandbox Code Playgroud)

如果您有 RStudio,则可以轻松查看d对象以确保其符合预期。

推送到 PostgreSQL

确保您从 CRAN 安装了RPostgreSQL,然后建立连接并将其发送data.frame到数据库:

library(RPostgreSQL)
conn <- dbConnect(PostgreSQL(), dbname="mydb")

dbWriteTable(conn, "some_table_name", d)
Run Code Online (Sandbox Code Playgroud)

现在some_table_name应该出现在数据库中。

一些常见的清理步骤可以从 pgAdmin 或 psql 完成:

ALTER TABLE some_table_name RENAME "row.names" TO id;
ALTER TABLE some_table_name ALTER COLUMN id TYPE integer USING id::integer;
ALTER TABLE some_table_name ADD PRIMARY KEY (id);
Run Code Online (Sandbox Code Playgroud)