如何使用R从SQL数据库中检索非常长的XML字符串?

时间:2012-11-23 08:43:33

标签: sql r odbc

我有一个脚本从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特定的问题。

任何想法如何解决?

2 个答案:

答案 0 :(得分:3)

我已写信给包裹作者,最后得到了以下答案:

  

你无法阅读不是我的问题,也不是一个合理的借口。

     

手册说

     

'\ item [字符类型]字符类型可以分为三种方式:   固定长度或可变长度,最大尺寸和字符
  设置使用。最常用的类型\ footnote {用于中的SQL名称   这些是\ code {CHARACTER VARYING}和\ code {CHARACTER},但这些是   对于日常使用而言过于繁琐。} \ code {varchar}简称   可变长度的字符串(最多一些)和\ code {char}   固定长度的短串(通常用空格填充右边)   “短”的值因DBMS而异,至少为254,通常为
  几千 - 通常其他类型可供更长时间使用   字符串。有一个完整性检查,只允许   读取时最多65535字节的字符串:可以通过
删除   重新编译\ pkg {RODBC}。'

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

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

答案 1 :(得分: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")
    
  4. 现在你应该可以阅读大字符串了。值得注意的是,由于尝试分配太多内存,您可能会收到错误(完整性检查后的行是:

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

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

    HTH