Je dois lire les données de la base de données et les enregistrer dans un fichier texte.
Comment puis-je faire cela en Ruby ? Existe-t-il un système de gestion de fichiers en Ruby ?
Je dois lire les données de la base de données et les enregistrer dans un fichier texte.
Comment puis-je faire cela en Ruby ? Existe-t-il un système de gestion de fichiers en Ruby ?
Il s'agit probablement d'un retour au nombre de caractères affectés. J'ai besoin d'un fichier objet en retour. Une idée ?
Vous pouvez utiliser la version courte :
File.write('/path/to/file', 'Some glorious content')
Il renvoie la longueur écrite ; voir ::écrire pour plus de détails et d'options.
Pour ajouter au fichier, s'il existe déjà, utilisez :
File.write('/path/to/file', 'Some glorious content', mode: 'a')
Pour information, cette méthode abrégée ne fonctionne qu'à partir de Ruby 1.9.3. Il n'existe aucune méthode de ce type dans les versions antérieures de 1.9 ou 1.8. Dans ce cas, vous devez utiliser la méthode de bloc plus longue proposée par @mvndaai.
C'est l'approche privilégiée dans la plupart des cas :
File.open(yourfile, 'w') { |file| file.write("your text") }
Lorsqu'un bloc est transmis à File.open
l'objet File sera automatiquement fermé à la fin du bloc.
Si vous ne passez pas de bloc à File.open
vous devez vous assurer que le fichier est correctement fermé et que le contenu a été écrit dans le fichier.
begin
file = File.open("/tmp/some_file", "w")
file.write("your text")
rescue IOError => e
#some error occur, dir not writable etc.
ensure
file.close unless file.nil?
end
Vous pouvez le trouver dans la documentation :
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;
}
Oui, l'utilisation de la syntaxe block avec { |file| .... fermera le fichier à la fermeture du bloc.
Cool, merci. Je n'en étais pas sûr. Voici plus d'informations sur les blocs et les File.open
blog.rubybestpractices.com/posts/rklemme/ c'est également mentionné dans la documentation officielle
Juste un truc à la ruby : nil est un objet, donc pour vérifier si un fichier est nul, on demande à l'objet lui-même au lieu de comparer (file.nil ? au lieu de file == nil).
Le Rubis Classe de fichiers vous donnera les tenants et les aboutissants de ::new
y ::open
mais son parent, le Classe IO Il s'agit là d'une question de fond, qui ne peut être résolue qu'avec l'aide de l'Union européenne. #read
y #write
.
Merci @Geoff. Il est bon de voir de nouveaux utilisateurs nettoyer des questions et des réponses périmées. Cela permet d'améliorer le site dans son ensemble.
Je trouve cela ironique. La réponse est très bien documentée... mais un an plus tard, cette question est la première à être trouvée sur Google. Lorsque la question a été posée, il a pu sembler que le PO ne consacrait que peu d'efforts, mais aujourd'hui, en ce qui concerne Google, il s'agit de la meilleure source.
Probablement parce que tout ce que vous avez besoin de savoir se trouve ici. La mienne est la réponse "apprendre à un homme à pêcher" pour ceux qui veulent lire les détails les plus fins, et il y a beaucoup de réponses "donner un poisson à un homme" ici aussi pour ceux qui veulent juste faire du copier-coller. Il n'est pas surprenant que cette combinaison soit bien classée sur Google.
Zambri Réponse de la Commission trouvé ici est le meilleur.
File.open("out.txt", '<OPTION>') {|f| f.write("write your stuff here") }
où se situent vos options en matière de <OPTION>
sont :
r
- Lire seulement. Le fichier doit exister.
w
- Créer un fichier vide pour l'écriture.
a
- Le fichier est créé s'il n'existe pas.
r+
- Ouvrir un fichier pour le mettre à jour en lecture et en écriture. Le fichier doit exister.
w+
- Créer un fichier vide pour la lecture et l'écriture.
a+
- Ouvrir un fichier pour le lire et l'annexer. Le fichier est créé s'il n'existe pas.
Dans votre cas, w
est préférable.
@CarySwoveland Je suis en fait d'accord avec vous. Le vrai problème est que l'une des deux questions aurait dû être marquée comme un doublon depuis longtemps. J'ai copié la réponse parce qu'une fois que j'ai trouvé la question à laquelle zanbri avait répondu, les fois suivantes où j'ai eu besoin de la même information, je suis tombé sur cette question en premier et j'ai dû trouver comment arriver à l'autre question. Finalement, j'ai pensé qu'il serait plus facile d'avoir sa réponse ici aussi. J'ai mis un lien vers sa réponse pour que les gens puissent cliquer dessus et lui donner un "upvote".
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.