2010-09-04 16 views
5

Jestem przyzwyczajony do perla i nowego do R. Wiem, że możesz czytać całe tabele używając read.table(), ale zastanawiam się, jak używać R do analizowania pojedynczej linii z pliku wejściowego.Podstawowe parsowanie pliku wejściowego w R

Konkretnie, co jest równoznaczne z następującym perl fragmencie:

open my $fh, $filename or die 'can't open file $filename'; 
my $line = <$fh>; 
my ($first, $second, $third) = split ("\t", $line); 

Odpowiedz

3

Podobny do powyższego byłoby:

filename <- 'your/file/name/here' 
fh <- file(filename, open='rt') 
line <- readLines(fh, n=1) 
tmp <- strsplit(line, "\\t") 
first <- tmp[[1]][1]; second <- tmp[[1]][2]; third <- tmp[[1]][3] 

Funkcja plik tworzy połączenie do pliku i otwiera go, otwarcie jest opcjonalne, ale jeśli nie otwieraj pliku, a kiedy go odczytasz, otworzy się, a następnie zamknij plik ponownie, jeśli otworzysz plik, pozostanie otwarty, a następny będzie kontynuowany od miejsca, w którym był poprzednio (najbliżej tego, co robiłby Perl powyżej).

Funkcja readLines odczyta określoną liczbę linii (1 w tym przypadku) , a następnie strsplit działa w zasadzie tak samo jak funkcja podziału Perla.

R nie ma wielu przypisań takich jak Perl (często najlepiej jest po prostu utrzymywać wyniki razem, a nie dzielić się na wiele zmiennych globalnych).

+0

Jedno ostrzeżenie - załaduje cały plik do pamięci i podzieli wszystkie wiersze. Jeśli plik jest ogromny i potrzebujesz tylko pierwszych trzech elementów, nie jest to z pewnością dobry pomysł. – mbq

+0

Dla małego pliku może przeczytać całą treść, ale w przypadku większych plików będzie tylko czytał część do pamięci, ponieważ będziesz czytać z pliku, który pobierze dodatkowe porcje. –

1

W ogóle, należy użyć scan to zrobić, lub w bardziej złożonych przypadkach odczytać cały plik z readLines i analizować je ręcznie strsplit s, grep s i takie tam.

W twoim przypadku:

scan(filename,character(0),nmax=3)->d 
first<-d[1];d[2]->second;third<-d[3] 
0

Wystarczy, aby pokazać inny sposób to zrobić (zakładając, że wejście jest „temp/3.txt”):

> d <- read.csv("temp/3.txt", sep="\t", stringsAsFactors=F, header=F, nrows=1) 
# Show the default column names: 
> colnames(d) 
[1] "V1" "V2" "V3" 
# Assign the requested column names 
> colnames(d) <- c("first", "second", "third") 
# Show the current structure of d 
> d 
    first second third 
1  1  2  3 
# Probably not recommended: Add the columns of d to the search path 
> attach(d) 
> first 
[1] 1 
# Clean up: 
> detach(d) 

Chyba najważniejszą część powyżej w zakresie adresowania pytanie jest tylko

nrows=1 

, która mówi, aby przeanalizować jeden wiersz danych wejściowych. (Pod spodem read.csv po prostu wywołuje funkcję skanowania).

Powiązane problemy