2010-03-16 3 views

Odpowiedz

-1

Istnieje StringIO.

Przepraszamy, błędne pytanie. Spójrz na this wydaje się mieć opcje strumieniowego

+0

To przeciwieństwo tego, czego potrzebuję! – jes5199

+0

Przepraszam, błędnie odczytałem Ci pytanie. Spójrz na http://tinyurl.com/ydrq8o8 wydaje się mieć opcje przesyłania strumieniowego. – nightshade427

1

Być może trzeba przerobić swoją parser trochę, ale można karmić linii z pliku do skanera jak ten:

File.open('filepath.txt', 'r') do |file| 
    scanner = StringScanner.new(file.readline) 
    until file.eof? 
    scanner.scan(/whatever/) 
    scanner << file.readline 
    end 
end 
+3

Wiem, że to lata później, ale wciąż odczytuje cały plik do pamięci. Po osiągnięciu eof "skaner" zatrzymuje pełną kopię pliku ... (Nie zwalnia nic po przejściu wskaźnika tekstowego poza zawartość) –

0

StringScanner zamierzano do tego, aby załadować duży ciąg i tam iz powrotem z wewnętrznym wskaźnikiem, jeśli sprawiają, że strumień, następnie odniesienia zgubić, nie można używać unscan, check_until, pre_match, posta _match, dobrze, ale do tego trzeba buforować wszystkie poprzednie dane wejściowe.

Jeśli obawiasz się rozmiaru bufora, po prostu wczytaj porcję danych i użyj prostego wyrażenia regularnego lub klejnotu o nazwie Parser. Najprostszym sposobem jest odczytanie rozmiaru poprawki danych.

# iterate over fixed length records 
open("fixed-record-file") do |f| 
    while record = f.read(1024) 
    # parse here the record using regexp or parser 
    end 
end 

[Aktualizacja]

Nawet z tej pętli można wykorzystać StringSanner, wystarczy zaktualizować ciąg znaków z każdej nowej porcji danych:

String = (str)

Zmienia ciąg skanowany do str i resetuje skaner. Powraca str