Ich muss die Daten aus der Datenbank lesen und dann in einer Textdatei speichern.
Wie kann ich das in Ruby machen? Gibt es ein Dateiverwaltungssystem in Ruby?
Ich muss die Daten aus der Datenbank lesen und dann in einer Textdatei speichern.
Wie kann ich das in Ruby machen? Gibt es ein Dateiverwaltungssystem in Ruby?
Es gibt wahrscheinlich die Anzahl der betroffenen Zeichen zurück. Ich brauche das Dateiobjekt als Rückgabewert. Irgendwelche Ideen?
Sie können die Kurzversion verwenden:
File.write('/Pfad/zur/Datei', 'Einige glorreiche Inhalte')
Es gibt die zurückgegebene Länge an; siehe ::write für weitere Details und Optionen.
Um an die Datei anzuhängen, wenn sie bereits existiert, verwenden Sie:
File.write('/Pfad/zur/Datei', 'Einige glorreiche Inhalte', mode: 'a')
FYI diese Kurzschreibweise funktioniert nur ab Ruby 1.9.3. Es gibt keine solche Methode in früheren Versionen von 1.9 oder 1.8. In diesem Fall müssen Sie die längere Blockmethode verwenden, die von @mvndaai veröffentlicht wurde.
Dies ist der bevorzugte Ansatz in den meisten Fällen:
File.open(deineDatei, 'w') { |file| file.write("dein Text") }
Wenn ein Block an File.open
übergeben wird, wird das File-Objekt automatisch geschlossen, wenn der Block beendet ist.
Wenn Sie keinen Block an File.open
übergeben, müssen Sie sicherstellen, dass die Datei ordnungsgemäß geschlossen wird und der Inhalt in die Datei geschrieben wurde.
begin
file = File.open("/tmp/some_file", "w")
file.write("dein Text")
rescue IOError => e
#Ein Fehler ist aufgetreten, Verzeichnis nicht beschreibbar usw.
ensure
file.close unless file.nil?
end
Sie finden es in der Dokumentation:
static VALUE rb_io_s_open(int argc, VALUE *argv, VALUE klass)
{
VALUE io = rb_class_new_instance(argc, argv, klass);
if (rb_block_given_p()) {
return rb_ensure(rb_yield, io, io_close, io);
}
return io;
}
Ja, die Verwendung der Blocksyntax mit { |file| .... } schließt die Datei, wenn der Block geschlossen wird.
Cool, danke. Ich war mir nicht sicher darüber. Hier ist mehr Information über Blöcke und File.open
blog.rubybestpractices.com/posts/rklemme/… es wird auch in der offiziellen Dokumentation erwähnt.
Etwas auf die Ruby-Art: nil ist ein Objekt, also um zu überprüfen, ob eine Datei Null ist, fragen Sie das Objekt selbst anstatt zu vergleichen (file.nil? anstelle von file == nil)
Die Ruby File-Klasse gibt Ihnen Einblicke in ::new
und ::open
, aber ihre Elternklasse, die IO-Klasse, geht tiefer in die Details von #read
und #write
.
Danke @Geoff. Es ist gut zu sehen, wie neue Benutzer veraltete Fragen und Antworten aufräumen. Macht die Seite insgesamt besser.
Ich finde das ironisch. Die Antwort ist sehr gut dokumentiert... aber jetzt, ein Jahr später, ist diese Frage der erste Treffer bei Google. Als die Frage gestellt wurde, mag es erschienen sein, dass der Fragesteller wenig Mühe investiert hat, aber aus Googles Sicht ist dies jetzt die beste Quelle.
Wahrscheinlich, weil hier alles steht, was man wirklich wissen muss. Meine Antwort entspricht dem Sprichwort "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben ", für diejenigen, die die Feinheiten lesen möchten, und es gibt auch viele "Gib einem Mann einen Fisch" Antworten hier für Leute, die einfach nur kopieren und einfügen möchten. Es ist nicht überraschend, dass diese Kombination auf Google gut gerankt ist.
Zambri's Antwort hier gefunden ist die beste.
File.open("out.txt", '') {|f| f.write("Schreibe hier deinen Text") }
wo deine Optionen für sind:
r
- Nur Lesen. Die Datei muss vorhanden sein.
w
- Erstelle eine leere Datei zum Schreiben.
a
- An eine Datei anhängen. Die Datei wird erstellt, falls sie nicht existiert.
r+
- Öffne eine Datei zum Aktualisieren, sowohl zum Lesen als auch zum Schreiben. Die Datei muss vorhanden sein.
w+
- Erstelle eine leere Datei zum Lesen und Schreiben.
a+
- Öffne eine Datei zum Lesen und Anhängen. Die Datei wird erstellt, falls sie nicht existiert.
In deinem Fall ist w
vorzuziehen.
@CarySwoveland Ich stimme tatsächlich mit Ihnen überein. Das eigentliche Problem ist, dass eine der beiden Fragen schon vor langer Zeit als Duplikat hätte markiert werden sollen. Ich habe die Antwort kopiert, weil ich einmal die Frage gefunden hatte, die zanbri beantwortet hatte, und die nächsten Male, als ich dieselben Informationen benötigte, zuerst auf diese Frage gestoßen bin und herausfinden musste, wie ich zur anderen Frage gelangen konnte. Schließlich dachte ich, es wäre einfacher, auch seine Antwort hier zu haben. Ich habe zu seiner Antwort verlinkt, damit hoffentlich Menschen darauf klicken und ihm auch einen Upvote geben.
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.