RODBC is the main library in R to import data from a database into R. RODBC
seems to have the ability of "guess" the datatype of the column which I find it particularly annoying.
I have uploaded a file test.xls
here, or you may create a xls file yourself:
col_a
and the second column named col_b
.col_a
, I typed letters on this column for 92 rows'
)library(RODBC)
setwd("C:/Users/hke775/Documents/Enoch/MISC/R_problems/RODBC")
channel <- odbcConnectExcel("test.xls",readOnly=TRUE)
dummy.df <- sqlFetch(channel,"Sheet1")
odbcClose(channel)
You will see that in dummy.df
, col_b
is all NA
, the 1923
in this column is gone.
If you want to see the 1923
again, you can change the 1st row of col_b
to a number, and it is back again.
This is very annoying as I don't prefer modifying data manually. I need to use other package to do the xls importing, but I can't find other packages do as smooth as RODBC
(I tried gdata
and xlsReadWrite
).
Did I missing anything in the sqlFetch
command, and cause the trouble? Thanks.
Please don't blame R or RODBC for Microsoft's bugs... ;)
However, due to a bug in the ODBC driver, specifying the Rows to Scan (MaxScanRows) setting currently has no effect. In other words, the Excel ODBC driver (MDAC 2.1 and later) always scans the first 8 rows in the specified data source in order to determine each column's datatype.
For additional information about the Rows to Scan bug, including a simple workaround, click the article number below to view the article in the Microsoft Knowledge Base:
189897 XL97: Data Truncated to 255 Characters with Excel ODBC Driver
I tried the fix in KB189897 by setting the TypeGuessRows
value to 0 and look what happens!
> library(RODBC)
> channel <- odbcConnectExcel("test.xls",readOnly=TRUE)
> tail(dummy.df <- sqlFetch(channel,"Sheet1"))
col_a col_b
87 c NA
88 d NA
89 e NA
90 f NA
91 g NA
92 h 1923
> odbcClose(channel)
Please, no up-votes or check marks... just send cash. :)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With