Seite 1 von 1

Einlesen mehrere Excel-Files via Schleife

BeitragVerfasst: Do 7. Aug 2014, 16:44
von trumpmilit
Schönen Nachmittag,
ich arbeite an meinem ersten Projekt in Stata: ich habe folgendes Problem: Ich möchte mehrere (ca. 200) Excel Dateien in Stata einlesen, um alle zu bearbeiten und als .dta abzulegen. Die Namen der Files sind Zahlen - allerdings nicht fortlaufend (sie sollen auch so bleiben, da ich diese Information für spätere merge-Befehle brauche) - also zB 1.xls, 3.xls, 4.xls, 10.xls.... Nun stellt sich die Frage, wie ich alle diese Files in die Schleife bringe? Mein Ansatz war so:

Code: Alles auswählen
foreach j of numlist 1 (1) 199 {
import excel using `j', clear
do "Bearbeitung.do"
save `j', replace
}


Diese Schleife hängt natürlich schon beim ersten Sprung (zB von 1 auf 3). Wie kann ich das überspringen - bzw. gibt es eine Möglichkeit bei foreach, dass zB zuerst im Verzeichnis alle Namen der Excel Dateien eingelesen werden?

Besten Dank im Voraus.
Johannes

Re: Einlesen mehrere Excel-Files via Schleife

BeitragVerfasst: Do 7. Aug 2014, 17:59
von daniel
Kopiere alle xls files, die Du bearbeiten willst - und nur diese - in eine Verzeichnis (sagen wir c:/myxlsfiles).

Code: Alles auswählen
loc xlsfiles : dir "c:/myxlsfiles" file "*.xls"
foreach fn of loc xlsfiles {
    import excel using `"`fn'"' ,clear
    do "c:/<whereeverBearbeitung.doissaved>/Bearbeitung.do"
    loc dtaname : subinstr loc fn ".xls" ".dta"
    sa `"`dtaname'" ,replace
}


Schau Dir dazu -help extended_fcn- an. -xls2dta- (SSC) mach ebenfalls hilfreichsein, wobei dieses Program alle files in Stata files umwandelt, ohne sie zu bearbeiten. Die Bearbeitung müsset also nachgeschaltet werden.

Re: Einlesen mehrere Excel-Files via Schleife

BeitragVerfasst: Do 7. Aug 2014, 18:55
von trumpmilit
Recht herzlichen Dank, funktioniert einwandfrei.

Eine kleine Frage hätte ich noch, mit den Anführungszeichen bin ich noch nicht vertraut, wie ich sehe (oder es ist ein anderes Problem):

Wenn ich in der Schleife noch eine Variable ändern will, geht das nicht so:

Code: Alles auswählen
loc xlsfiles : dir "c:/myxlsfiles" file "*.xls"
foreach fn of loc xlsfiles {
    import excel using `"`fn'"' ,clear
    do "c:/<whereeverBearbeitung.doissaved>/Bearbeitung.do"
    [b]replace A = `"`fn'"'[/b]
    loc dtaname : subinstr loc fn ".xls" ".dta"
    sa `"`dtaname'" ,replace
}


grs: für strings/Pfade wird: "STRING" verwendet - bei Zugriff auf Variablen doch: `VAR' - was bedeutet jetzt dieses `"`VAR'"' - ist das für local Variablen. Beim obigen REPLACE erhalte ich: "type mismatch".

Re: Einlesen mehrere Excel-Files via Schleife

BeitragVerfasst: Do 7. Aug 2014, 22:48
von daniel
Du versuchst in Variable A eine Zeichenkette, nämlich den Namen des jeweiligen Excel Datensatzes zu schreiben. Aus welchem Grund?

Der Fehler resultiert vermutlich daraus, dass A eine numerische Variable ist.

Re: Einlesen mehrere Excel-Files via Schleife

BeitragVerfasst: Mo 11. Aug 2014, 11:33
von trumpmilit
ja, ganz genau. Aber ich brauche diese Information der FN, sie dienen als Info für einen späteren merge-Befehl.

hier meine Lösung - sicher kein guter Stil, aber es funktioniert:

Code: Alles auswählen
foreach fn of loc xlsfiles {
    import excel using `"`fn'"' ,clear
    do "C:\PFAD\Bearbeitung.do"
   tostring A, replace
   replace A = `"`fn'"'
   replace A = subinstr(countrygroup, ".xls", "", 1)
   destring A, replace force
    loc dtaname : subinstr loc fn ".xls" ".dta"
   sa `"`dtaname'"' ,replace
}


Danke nochmals für die Hilfe.