2010-11-18 8 views
2

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

+0

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. –

+0

@Brandon: Das habe ich auch gemacht, aber es ist immer noch ein Mist, dass ich es so machen muss. –

Antwort

1

Können Sie stattdessen die Perl-basierte Lösung in gdata verwenden? Das ist auch tragbar ...

+0

Ach, erinnerst du dich an diesen Client, bei dem ich sogar sicherstellen muss, dass R nicht mit dem Internet verbunden sein muss? Auf keinen Fall erlauben sie mir, Perl zum Set hinzuzufügen ... –

+1

Ruf den Bluff. Excel kann auch - also wen interessiert das schon. Zeit, klügere Kunden zu bekommen? –

+0

müssen Sie vorsichtig sein, was ich hier sage, aber lassen Sie es uns auf eine leichte Meinungsverschiedenheit zwischen mir und dem Senior Professor über die Aufgaben eines akademischen statistischen Beraters halten. Außerdem hoffe ich, sie davon zu überzeugen, tatsächlich die Datenbank zu verwenden, die sie haben. Gerade jetzt ziehen sie die Excel-Blätter von dort, stell dir vor. * facepalm * –

Verwandte Themen