R 数据导入/导出¶

英国365老板 2026-07-18 02:10:57 admin

上一页: 使用 DBI 的包,上一级: R 接口包 [目录][索引]

4.3.2 RODBC 包 ¶

CRAN 上的 RODBC 包提供了对支持 ODBC 接口的数据库源的接口。 这是非常广泛可用的,并且允许相同的 R 代码访问不同的数据库系统。 RODBC 在 Unix/Linux、Windows 和 macOS 上运行,几乎所有数据库系统都提供对 ODBC 的支持。 我们已经在 Windows 上测试了 Microsoft SQL Server、Access、MySQL、PostgreSQL、Oracle 和 IBM DB2,以及 Linux 上的 MySQL、MariaDB、Oracle、PostgreSQL 和 SQLite。

ODBC 是一个客户端-服务器系统,我们已经成功地从 Windows 客户端连接到运行在 Unix 服务器上的 DBMS,反之亦然。

在 Windows 上,ODBC 支持是操作系统的一部分。 在 Unix/Linux 上,您将需要一个 ODBC 驱动程序管理器,例如 unixODBC (https://www.unixodbc.org/) 或 iOBDC (https://www.iodbc.org/:这在 macOS 中预先安装) 以及您数据库系统的已安装驱动程序。

Windows 不仅为 DBMS 提供驱动程序,还为 Excel (.xls) 电子表格、DBase (.dbf) 文件甚至文本文件提供驱动程序。(不需要安装上面提到的应用程序。支持的文件格式取决于驱动程序的版本。)有适用于 Excel 和 Access 2007/2010 的版本(访问 https://www.microsoft.com/en-us/download/default.aspx,搜索“Office ODBC”,这将引导您找到 AccessDatabaseEngine.exe),以及“2007 Office System Driver”(后者有适用于 64 位 Windows 的版本,并且也可以读取早期版本)。

在 macOS 上,Actual Technologies (https://www.actualtech.com/product_access.php) 驱动程序为 Access 数据库和 Excel 电子表格(不包括 Excel 2007/2010)提供 ODBC 接口。

可以建立多个并发连接。通过调用 odbcConnect 或 odbcDriverConnect(在 Windows GUI 上,这允许通过对话框选择数据库)打开连接,该调用返回一个句柄,用于后续访问数据库。打印连接将提供有关 ODBC 连接的一些详细信息,调用 odbcGetInfo 将提供有关客户端和服务器的详细信息。

通过调用 close 或 odbcClose 关闭连接,并且当没有 R 对象引用它时以及在 R 会话结束时也会关闭连接(并发出警告)。

可以使用 sqlTables 查找连接上的表的详细信息。

函数 sqlSave 将 R 数据框复制到数据库中的表,而 sqlFetch 将数据库中的表复制到 R 数据框。

一个 SQL 查询可以通过调用 sqlQuery 发送到数据库。这将返回一个 R 数据框中的结果。(sqlCopy 将查询发送到数据库并将结果保存为数据库中的表。) 通过首先调用 odbcQuery 然后调用 sqlGetResults 来获取结果,可以获得更精细的控制。后者可以在循环中使用,以一次检索有限数量的行,就像函数 sqlFetchMore 一样。

以下是一个使用 PostgreSQL 的示例,其中 ODBC 驱动程序将列名和数据框名称映射为小写。我们使用之前创建的数据库 testdb,并在 ~/.odbc.ini 中的 unixODBC 下设置了 DSN(数据源名称)。完全相同的代码在使用 MyODBC 访问 Linux 或 Windows 下的 MySQL 数据库时也能正常工作(其中 MySQL 也将名称映射为小写)。在 Windows 下,DSN 在控制面板中的 ODBC 小程序中设置(在“管理工具”部分中的“数据源 (ODBC)”)。

> library(RODBC)

## tell it to map names to l/case

> channel <- odbcConnect("testdb", uid="ripley", case="tolower")

## load a data frame into the database

> data(USArrests)

> sqlSave(channel, USArrests, rownames = "state", addPK = TRUE)

> rm(USArrests)

## list the tables in the database

> sqlTables(channel)

TABLE_QUALIFIER TABLE_OWNER TABLE_NAME TABLE_TYPE REMARKS

1 usarrests TABLE

## list it

> sqlFetch(channel, "USArrests", rownames = "state")

murder assault urbanpop rape

Alabama 13.2 236 58 21.2

Alaska 10.0 263 48 44.5

...

## an SQL query, originally on one line

> sqlQuery(channel, "select state, murder from USArrests

where rape > 30 order by murder")

state murder

1 Colorado 7.9

2 Arizona 8.1

3 California 9.0

4 Alaska 10.0

5 New Mexico 11.4

6 Michigan 12.1

7 Nevada 12.2

8 Florida 15.4

## remove the table

> sqlDrop(channel, "USArrests")

## close the connection

> odbcClose(channel)

作为在 Windows 下使用 ODBC 和 Excel 电子表格的简单示例,我们可以通过以下方式从电子表格中读取数据:

> library(RODBC)

> channel <- odbcConnectExcel("bdr.xls")

## list the spreadsheets

> sqlTables(channel)

TABLE_CAT TABLE_SCHEM TABLE_NAME TABLE_TYPE REMARKS

1 C:\\bdr NA Sheet1$ SYSTEM TABLE NA

2 C:\\bdr NA Sheet2$ SYSTEM TABLE NA

3 C:\\bdr NA Sheet3$ SYSTEM TABLE NA

4 C:\\bdr NA Sheet1$Print_Area TABLE NA

## retrieve the contents of sheet 1, by either of

> sh1 <- sqlFetch(channel, "Sheet1")

> sh1 <- sqlQuery(channel, "select * from [Sheet1$]")

请注意,表的规范与 sqlTables 返回的名称不同:sqlFetch 能够映射这些差异。