Ich habe ein weiteres rätselhaftes Problem.Keine Spaltennamen beim Lesen von .xls-Dateien mit RODBC verwenden
Ich muss .xls-Dateien mit RODBC lesen. Im Grunde brauche ich eine Matrix aller Zellen in einem Blatt und benutze dann Greps und Strsplits, um die Daten herauszuholen. Da jedes Blatt mehrere Tabellen in unterschiedlicher Reihenfolge und einige Textfelder mit anderen Optionen dazwischen enthält, brauche ich etwas, das wie readLines()
funktioniert, aber dann für Excel-Blätter. Ich glaube RODBC ist der beste Weg das zu tun.
Der Kern meines Codes ist folgende Funktion:
.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)
}
Doch was auch immer ich versuchte, es nimmt immer die erste Zeile des erwähnten Blatt als die Variablennamen des Datenrahmens zurückgegeben. Keine Ahnung wie das gelöst werden kann. Laut der Dokumentation sollte colnames=FALSE
das verhindern.
Ich möchte das xlsReadWrite
Paket vermeiden. Bearbeiten: und das gdata
Paket. Client hat Perl nicht auf dem System und wird es nicht installieren.
Edit:
Ich gab auf und ging mit read.xls()
aus dem xlsReadWrite
Paket. Abgesehen von dem Namensproblem stellte sich heraus, dass RODBC Zellen mit speziellen Zeichen wie Schrägstrichen nicht wirklich lesen kann. Ein Datum im Format "TT/MM/JJJJ" gab NA einfach.
Mit Blick auf den Quellcode von sqlFetch, sqlQuery und sqlGetResults erkannte ich, dass das Problem in den Treibern mehr als wahrscheinlich ist. Irgendwie wird die erste Zeile des Blattes als eine Spaltenfunktion anstelle einer gewöhnlichen Zelle angesehen. Sie sind also anstelle von Spaltennamen gleichbedeutend mit DB-Feldnamen. Und das ist eine Option, die Sie nicht festlegen können ...
Ich hatte dieses Problem auch. Die Art und Weise, wie ich damit umgegangen bin, war, einen Manipulationscode hinterher zu schreiben, um gefälschte Daten zu löschen und Spalten umzubenennen. –
@Brandon: Das habe ich auch gemacht, aber es ist immer noch ein Mist, dass ich es so machen muss. –