4

我有一个脚本可以从 SQL 数据库中获取 XML 文件。这是我如何做到的:

library(RODBC)
library(XML)

myconn <- odbcConnect("mydsn")

query.text <- "SELECT xmlfield FROM db WHERE id = 12345"
doc <- sqlQuery(myconn, query.text, stringsAsFactors=FALSE)
doc <- iconv(doc[1,1], from="latin1", to="UTF-8")
doc <- xmlInternalTreeParse(doc, encoding="UTF-8")

但是,解析不适用于特定的数据库行,尽管当我将此字段的内容复制到单独的文件中并从文件中解析时它起作用了。经过两天的“反复试验”,我确定了主要问题。似乎以这种方式查询短 XML 文件不会导致任何问题,但是当我查询较大的文件时,字符串在 65534 个字符后被截断。因此,缺少 XML 文件的结尾,无法解析该文件。

我认为这可能是对我计算机上 ODBC 连接的总体限制。但是,另一个也使用 ODBC 从同一数据库中获取同一 XML 字段的程序可以毫无问题地执行此操作。所以我想这是一个R特定的问题。

任何想法如何解决它?

4

2 回答 2

4

我已经写信给包作者,终于收到了以下答复:

你不识字不是我的问题,也不是合理的借口。

手册说

'\item[Character types] 字符类型可以分为三种方式:固定或可变长度、最大大小和使用的字符
集。最常用的类型\footnote{它们的 SQL 名称
是 \code{CHARACTER VARYING} 和 \code{CHARACTER},但是
对于日常使用来说太麻烦了。} 对于
可变长度的短字符串 (到某个最大值)和 \code{char} 用于
固定长度的短字符串(通常用空格右填充)。
'short' 的值因 DBMS 不同而不同,至少为 254,通常为
几千——通常其他类型可用于更长的
字符串。有一个健全性检查,
在读取时只允许最多 65535 个字节的字符串:这可以通过以下方式删除
重新编译 \pkg{RODBC}。

本手册可在软件包doc目录中找到。RODBC此信息不包含在参考手册中。

同时我找到了一个很好的解决方案来检索我的数据而不使用RODBC,我没有尝试重新编译这个包。但我希望这个答案对那些遇到同样问题的人有所帮助。

于 2012-12-05T13:46:40.197 回答
3

如果您想更改 RODBC 的源并重新编译,使用 github 和 devtools 包相当容易:

  1. 在这里分叉回购:https ://github.com/cran/RODBC
  2. 注释掉这一行(这来自 R-3.03 版本):https ://github.com/cran/RODBC/blob/R-3.0.3/src/RODBC.c#L734

            if (datalen > 65535) datalen = 65535;
    
  3. (重新)从 github 安装:

    devtools::install.github("<yourgithubname>/RODBC")
    

现在您应该能够读取大字符串。不过需要注意的是,由于尝试分配过多的内存,您可能会遇到错误(健全性检查之后的行是:

    thisHandle->ColData[i].pData = Calloc(nRows * (datalen + 1), char);

因此,最简单的方法是在 R 的 sqlQuery 调用中设置参数 rows_at_time = 1

高温高压

于 2017-05-29T11:38:42.460 回答