2010-03-16 5 views
5

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

-1

Il existe StringIO.

Désolé j'ai mal lu votre question. Jetez un oeil à this semble avoir des options de streaming

+0

C'est le contraire de ce dont j'ai besoin! – jes5199

+0

Désolé, vous avez mal lu votre question. Jetez un oeil à http://tinyurl.com/ydrq8o8 semble avoir des options de diffusion en continu. – nightshade427

1

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 
+3

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) –

0

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