раздражающая «фича» (или баги?) для RODBC - PullRequest
5 голосов
/ 30 января 2012

RODBC является основной библиотекой в ​​R для импорта данных из базы данных в R. RODBC, кажется, обладает способностью "угадать" тип данных столбца, который мне кажется особенно раздражающим.

Я загрузил файл test.xls здесь , или вы можете создать файл xls самостоятельно:

  1. создать 2 столбца, первый столбец с именем col_a и второй столбец с именем col_b.
  2. наберите что угодно в col_a, я набрал буквы в этом столбце для 92 строк
  3. в 92-й строке col_b, введите там число, я набрал «1923», не меняя тип данных (т.е. не используя ')
  4. попробуйте импортировать файл xls в R, используя следующий скрипт:

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)

Вы увидите, что в dummy.df, col_b все NA, 1923 в этом столбце пропало.

Если вы хотите снова увидеть 1923, вы можете изменить 1-й ряд col_b на число, и оно снова вернется.

Это очень раздражает, так как я не предпочитаю изменять данные вручную. Мне нужно использовать другой пакет для импорта xls, но я не могу найти, чтобы другие пакеты работали так же гладко, как RODBC (я пробовал gdata и xlsReadWrite).

Я что-то пропустил в команде sqlFetch и вызвал проблему? Спасибо.

1 Ответ

8 голосов
/ 31 января 2012

Пожалуйста, не обвиняйте R или RODBC в ошибках Microsoft ...;)

Однако из-за ошибки в драйвере ODBC указание строк для сканирования(MaxScanRows) настройка в настоящее время не имеет никакого эффекта.Другими словами, драйвер ODBC для Excel (MDAC 2.1 и более поздние версии) всегда сканирует первые 8 строк в указанном источнике данных, чтобы определить тип данных каждого столбца.

Для получения дополнительной информации об ошибке строк для сканирования, включаяпростой обходной путь, щелкните номер статьи ниже, чтобы просмотреть статью в базе знаний Майкрософт:

189897 XL97: данные усекаются до 255 символов с помощью драйвера ODBC для Excel

Я попытался исправить это в KB189897 , установив значение TypeGuessRows в 0 и посмотрим, что произойдет!

> 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)

Пожалуйста, никаких повышенных голосов или галочек ... простоотправить наличными.:)

...