J'ai un analyseur écrit à l'aide du StringScanner standard de Ruby. Ce serait bien si je pouvais l'utiliser sur des fichiers en streaming. Existe-t-il un équivalent à StringScanner qui ne nécessite pas que je charge toute la chaîne en mémoire?Analyse de StringScanner IO au lieu d'une chaîne
Répondre
Il existe StringIO.
Désolé j'ai mal lu votre question. Jetez un oeil à this semble avoir des options de streaming
Vous pourriez avoir à retravailler votre analyseur un peu, mais vous pouvez alimenter les lignes d'un fichier à un scanner comme celui-ci:
File.open('filepath.txt', 'r') do |file|
scanner = StringScanner.new(file.readline)
until file.eof?
scanner.scan(/whatever/)
scanner << file.readline
end
end
Je sais que c'est des années plus tard, mais qui lit toujours le fichier en mémoire. Une fois que vous avez atteint le eof « scanner » est maintenant la copie complète du fichier ... (Il ne libère rien après le pointeur de la chaîne passe devant le contenu) –
StringScanner était destiné pour cela, pour charger une grande chaîne et va et vient avec un pointeur interne, si vous faites un flux, puis les références se perdent, vous ne pouvez pas utiliser unscan, check_until, pre_match, poste _match, bien que vous pouvez, mais pour cela, vous devez mettre en tampon toutes les entrées précédentes.
Si vous êtes préoccupé par la taille du tampon puis juste charge en bloc de données, et d'utiliser une expression rationnelle simple ou un bijou appelé Parser. La méthode la plus simple consiste à lire une taille de données fixe.
# 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
[Mise à jour]
Même avec cette boucle, vous pouvez utiliser StringSanner, il vous suffit de mettre à jour la chaîne avec chaque nouveau bloc de données:
string = (str)
Modifie la chaîne en cours de numérisation à str et remet à zéro le scanner. Renvoie str
C'est le contraire de ce dont j'ai besoin! – jes5199
Désolé, vous avez mal lu votre question. Jetez un oeil à http://tinyurl.com/ydrq8o8 semble avoir des options de diffusion en continu. – nightshade427