Mam parser napisany przy użyciu standardowego StringScannera ruby. Byłoby miło, gdybym mógł go użyć do przesyłania strumieniowego plików. Czy istnieje odpowiednik StringScanner, który nie wymaga, aby załadować cały ciąg do pamięci?Skanowanie StringScanner IO zamiast ciągu znaków
Odpowiedz
Istnieje StringIO.
Przepraszamy, błędne pytanie. Spójrz na this wydaje się mieć opcje strumieniowego
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
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ść) –
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
To przeciwieństwo tego, czego potrzebuję! – jes5199
Przepraszam, błędnie odczytałem Ci pytanie. Spójrz na http://tinyurl.com/ydrq8o8 wydaje się mieć opcje przesyłania strumieniowego. – nightshade427