2016-07-17 11 views
0

Ich habe .csv Dateien in einem Verzeichnis (sagen wir C:/Dowloads). Ich kann alle Dateien aus diesem Verzeichnis mit dem list.files("path") lesen. Aber ich kann eine bestimmte Anzahl von Dateien nicht mit einer for-Schleife lesen. Das heißt, können sagen, ich habe 332 Dateien und ich möchte nur nur lesen, Dateien 1 bis 10 oder 5 bis 10.Liste der .csv-Dateien in einem bestimmten Verzeichnis

Hier ist ein Beispiel:

files <- list.files("path") 
files ## displays all the files. 

nun zum Testen habe ich:

k <- files[1:10] 
k 
## here it displays the files from 1 to 10. 

Also behielt ich die gleiche Sache mit einer for Schleife, wie ich Dateien nacheinander lesen will.

for(i in 1:length(k)){ 
    length(i) ## just tested the length 
} 

Aber es wird als NA oder Null oder 1 geben.

Kann jemand erklären, wie kann ich spezifizierte .csv Akten mit einer for Schleife oder einem anderen Weg lesen?

+0

'i' ist nur eine einzelne Zahl, daher sollte die Länge von' i' immer '1' sein. Wenn Sie etwas anderes als das bekommen (zB "NA"), müssen Sie ein [reproduzierbares Beispiel] (http://stackoverflow.com/q/5963269/1217536) veröffentlichen, mit dem die Leute zusammenarbeiten können, um herauszufinden, warum . Wenn Sie * Dateien in einer 'for'-Schleife lesen wollen, warum versuchen Sie nicht' read.table (file = files [i]) ''? – gung

Antwort

2

list.files geben Sie einen Zeichenvektor der Klasse character zurück. Ein Zeichenvektor ist ein Vektor von Zeichenfolgen (d. H. Zeichen). Die Funktion length, die auf einen Zeichenvektor files oder einen Bereich von Elementen innerhalb des Zeichenvektors files[1:10] oder auf ein einzelnes Element in einem Zeichenvektor files[i] angewendet wird, gibt die Anzahl der Zeichenfolgen in diesem Zeichenvektor, die Anzahl der Zeichenfolgen im Bereich oder 1 zurück , beziehungsweise. Verwenden Sie stattdessen nchar, um die Anzahl der Zeichen für jedes Element (jede Zeichenfolge) des Zeichenvektors zu ermitteln. Also:

path.to.csv <- "/path/to/your/csv/files" 
files<-list.files(path.to.csv) 
print(files) ## list all files in path 

k<-files[1:10] 
print(k)  ## list first 10 files in path 

for(i in 1:length(k)) { ## loop through the first 10 files 
    print(k[i]) ## each file name 
    print(nchar(k[i])) ## the number of characters in each file name 
    df <- read.csv(paste0(path.to.csv,"/",k[i])) ## read each as a csv file 
    ## process each df in turn here 
} 

Beachten Sie, dass wir den „Pfad“ an den Dateinamen in Aufruf read.csvpaste haben.

EDIT: Ich dachte, ich fügen Sie diese als Alternative:

path.to.csv <- "/path/to/your/csv/files" 
files<-list.files(path.to.csv) 

for(iFile in files) { ## loop through the files 
    print(iFile) ## each file name 
    print(nchar(iFile)) ## the number of characters in each file name 
    df <- read.csv(paste0(path.to.csv,"/",iFile)) ## read each as a csv file 
    ## process each df in turn here 
} 

Hier ist die for Schleife ist über die Sammlung (Vektor) von files so dass iFile ist die i -te Dateinamen.

Hoffe, das hilft.

+0

'df' wird mit jeder Iteration überschrieben – user20650

+0

@ user20650: ja, tatsächlich. Ich gehe davon aus, dass er jede Datei der Reihe nach verarbeiten soll, wenn er "Dateien nacheinander lesen" sagt. Ich habe den Beitrag bearbeitet, um dies zu reflektieren. Die Antwort soll kein "Ende-alles" sein, gerade genug, um hoffentlich seine Frage zu beantworten. Ich habe keine Ahnung, wie er die Daten in jeder dieser Dateien verarbeiten möchte. – aichao

2

Leider gibt es kein reproduzierbares Beispiel. Normalerweise, wenn ich ähnliche Aufgaben zu tun haben, kann ich so:

files <- list.files(pattern='*.csv') # this search all .csv files in current working directory 
for(i in 1:length(files){ 
    read.csv(files[i], stringsAsFactors=F) 
} 

Ihr Code funktioniert nicht, weil Sie die Länge eines Index zu test, nicht des Vektors. Hoffe, das hilft

2

Um eine bestimmte Anzahl von Dateien gleichzeitig zu lesen, können Sie Ihren Vektor von Dateien unterteilen.Zuerst einen Vektor Ihrer Dateien erstellen, einschließlich einem Pfad:

f = list.files("/dir/dir", full.names=T, pattern="csv") 
# nb full.names returns the full path to each file 

Dann jede Datei in einem separaten Liste Artikel lesen (in diesem Fall die ersten 10):

dl = lapply(f[1:10], read.csv) 

Schließlich hat eine siehe Listenelement 1:

head(dl[[1]]) 
Verwandte Themen