Ruby wird die Datei öffnen, aber nicht schreiben?
Ich versuche zu schaffen, eine grundlegende ruby-Spachtel, die greifen, werden alle Wörter mit 8 Buchstaben oder mehr, die aus html-Quellcode. Und es speichert diese in einer Datei entsprechend dem ersten Zeichen des Wortes. Scheint einfach, nicht wahr?
re = /\w{8,}/
cre = /[a-z0-9]/
a = b.html #This grabs the html from the browser
matchx = a.scan(re)
matchx.each do |xx|
word = xx.to_s.downcase.chomp
fchar = word[0].chr
if (fchar.match(cre)) #Not sure if I need this
@pcount += 1
fname = @WordsFName+fchar #@WordsFName is a prefix
tmpF = File.open(fname,"a+")
#Check for duplicates, if not write to file
exists = File.readlines(fname).any? { |li| li[word] }
if (!exists)
tmpF.write(word+"\n")
print word
@wcount += 1
end
end
end
Ruby erfolgreich packt alle Wörter, bekommt das erste Zeichen, und öffnet alle notwendigen Dateien, kann Sie aber nicht schreiben. Auch die print-Methode druckt alle Wörter, einschließlich der Duplikate, aber die Inspektion, die jede? Methode auf irb gab keine Probleme..
- Sie bekommen eine Fehlermeldung?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Datei#schreiben gepuffert ist und Sie nichts tun, um die bündig oder in der Nähe tmpF zwischen Ihrem schreiben und die Datei.readlines(fname), so dass die readlines werden nie finden Sie in der Ausgabe, bis es geleert. Ich sehe keinen Aufruf zum schließen auf tmpF also, es ist nicht klar, Wann das schreiben von Daten geleert werden, außer das Programm beenden, wenn das file-Objekt fertig ist, oder GC einige Zeit nach tmpF geht out of scope.
Könnten Sie manuell Spülen nach dem schreiben mit
tmpF.flush
oder stellen Sie das Standard-Verhalten mittmpF.sync = true
nach dem öffnen.Beachten Sie, dass jede Datei wird größer, die Kosten Ihrer dup check wird Ballon, wie es liest die gesamte Datei. Wenn das Wort set in den Hauptspeicher paßt, sollten Sie nur halten ein hash der Wörter, die Sie gesehen haben, wenn es ist größer als die im Arbeitsspeicher gespeichert werden können, sollten Sie einen Schlüssel-Wert-Speicher statt Wiederlesen eine serielle Datei jedes mal.
Habe ich mich im irb-Ansatz zu verstehen, flushing Verhalten. Das Hauptproblem mit der OP-code ist, es gibt keine expliziten/impliziten flush oder close auf die tmpF-Datei. Also die partielle schreibt, die wahrscheinlich weniger als die Größe des Puffers nur geschrieben, wenn die tmpF File-Objekt bekommt die garbage Collection oder beim Programm beenden. tmpF zugewiesen bekommt einen neu geöffneten Datei-Objekt jedes mal durch die Schleife, so dass die Dateien geöffnet, die auf vorherigen Iterationen erhalten nur geleert, wenn Sie Finalisiert bei GC.