我有一个脚本从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
特定的问题。
任何想法如何解决?
答案 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软件包相当容易:
注释掉这一行(来自R-3.03版本):https://github.com/cran/RODBC/blob/R-3.0.3/src/RODBC.c#L734
if (datalen > 65535) datalen = 65535;
(重新)从github安装:
devtools::install.github("<yourgithubname>/RODBC")
现在你应该可以阅读大字符串了。值得注意的是,由于尝试分配太多内存,您可能会收到错误(完整性检查后的行是:
thisHandle->ColData[i].pData = Calloc(nRows * (datalen + 1), char);
因此最简单的方法是在R的sqlQuery调用中设置参数rows_at_time = 1
HTH