gre*_*een 27 sql postgresql excel
我在excel中开发了一个庞大的表,现在面临将其转移到postgresql数据库的问题.我已经下载了odbc软件,我可以用excel打开在postgresql中创建的表.但是,我无法以相反的方式执行此操作,即在Excel中创建表并在postgresql中打开它.所以我想知道它可以通过这种方式完成,或者是否有任何替代方法可以创建一个带有pgAdmin III的大表,因为原始插入数据是非常繁琐的.
在此先感谢您的所有帮助!
Chr*_*ers 33
典型的答案是这样的:
在Excel,文件/另存为中,选择CSV,保存当前工作表.
转移到postgres用户可以访问的Pg服务器上的保留目录
在PostgreSQL中:
COPY mytable FROM '/path/to/csv/file' WITH CSV HEADER; -- must be superuser
Run Code Online (Sandbox Code Playgroud)但是还有其他方法可以做到这一点.PostgreSQL是一个令人惊讶的可编程数据库.这些包括:
用pl/javaU,pl/perlU或其他不受信任的语言编写模块来访问文件,解析它并管理结构.
使用CSV和fdw_file将其作为伪表进行访问
使用DBILink和DBD :: Excel
编写自己的外部数据包装器以读取Excel文件.
可能性几乎无穷无尽......
您还可以使用psql控制台执行\ copy而无需将文件发送到Postgresql服务器计算机.命令是一样的:
\copy mytable [ ( column_list ) ] FROM '/path/to/csv/file' WITH CSV HEADER
Run Code Online (Sandbox Code Playgroud)
对于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。
使用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)
简要用法:
使用 ogr_fdw_info.exe 探测 Excel 文件中的工作表名称列表
ogr_fdw_info -s "C:/excel.xlsx"
Run Code Online (Sandbox Code Playgroud)使用“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 文件的访问权限。
我使用的一种方法是将表作为 a加载到R中data.frame
,然后用于dbWriteTable
将其推送到 PostgreSQL。这两个步骤如下所示。
R的data.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
对象以确保其符合预期。
确保您从 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)