У меня есть еще одна загадочная проблема.
Мне нужно прочитать файлы .xls с помощью RODBC. В основном мне нужна матрица всех ячеек на одном листе, а затем использовать greps и strsplits и т. д., чтобы получить данные. Поскольку каждый лист содержит несколько таблиц в разном порядке и некоторые текстовые поля с другими параметрами между ними, мне нужно что-то, что работает как readLines()
, но затем для листов Excel. Я считаю, что RODBC лучший способ сделать это.
Ядром моего кода является следующая функция:
.read.info.default <- function(file,sheet){
fc <- odbcConnectExcel(file) # file connection
tryCatch({
x <- sqlFetch(fc,
sqtable=sheet,
as.is=TRUE,
colnames=FALSE,
rownames=FALSE
)
},
error = function(e) {stop(e)},
finally=close(fc)
)
return(x)
}
Тем не менее, что бы я ни пытался, он всегда принимает первую строку упомянутого листа в качестве имен переменных возвращаемого фрейма данных. Без понятия, как это решить. Согласно документации, colnames=FALSE
должен предотвратить это.
Я бы хотел избежать пакета xlsReadWrite
. Изменить: и пакет gdata
. У клиента нет Perl в системе, и он не будет его устанавливать.
Редактировать:
Я сдался и пошел с read.xls()
из пакета xlsReadWrite
. Помимо проблемы с именем, оказалось, что RODBC не может читать ячейки со специальными знаками, такими как косая черта. А дату в формате "дд/мм/гггг" как раз давал NA.
Глядя на исходный код sqlFetch, sqlQuery и sqlGetResults, я понял, что проблема, скорее всего, в драйверах. Почему-то первая строка листа видится как некая функция столбца, а не обычная ячейка. Таким образом, вместо имен столбцов они эквивалентны именам полей БД. И это опция, которую вы не можете установить...