28 votes

Comment lire un fichier ligne par ligne dans la langue de votre choix?

Je me suis inspiré pour essayer Haskell nouveau basé sur une récente réponse. Mon big block est que la lecture d'un fichier ligne par ligne (une tâche simple dans des langages tels que Perl) semble compliqué dans un langage fonctionnel. Comment lire un fichier ligne par ligne dans votre langue préférée?


De sorte que nous sommes de comparer des pommes à d'autres types de pommes, s'il vous plaît écrire un programme qui numérote les lignes du fichier d'entrée. Donc, si votre entrée est:

Line the first.
Next line.
End of communication.

La sortie devrait ressembler:

1       Line the first.
2       Next line.
3       End of communication.

Je vais poster mes Haskell programme comme un exemple.


Ken a fait observer que cette question ne précise pas comment les erreurs doivent être traitées. Je ne suis pas trop inquiet à ce sujet parce que:

  1. La plupart des réponses a fait la chose la plus évidente et lire à partir de stdin et a écrit à l' stdout. La bonne chose est qu'il oblige l'utilisateur à réorienter les flux de la manière qu'ils veulent. Donc, si stdin est redirigé à partir d'un fichier inexistant, le shell va prendre soin de signalement de l'erreur, par exemple.

  2. La question est plus destiné à la façon dont une langue ne IO que la façon dont il gère les exceptions.

Mais, si nécessaire, la gestion des erreurs est manquant dans une réponse, n'hésitez pas à modifier le code pour corriger ou de faire une note dans les commentaires.

21voto

vezult Points 3812

Python

Python est ma langue de son choix. Voici comment une telle opération serait aller:

myfile = open('foo.txt')

for index, line in enumerate(myfile):
    print '%i  %s' % (index, line)

fait!


Un plus générales version:

#!/usr/bin/env python
import fileinput, sys

for n, line in enumerate(fileinput.input(), 1):
    sys.stdout.write("%d\t%s" % (n, line))

21voto

Steve Hanov Points 3685

Le Commodore 64 de BASE

10 OPEN2,8,2,"0:TESTFILE,S,R"
20 L=1
30 INPUT#2,A$:IF STATUS AND 64 THEN GOTO 50
40 PRINT L "   " A$:L=L+1:GOTO30
50 CLOSE2

Beaucoup plus courte que VB6.

19voto

toolkit Points 27248

Perl 5

#!/usr/bin/env perl
while (<>) { print "$.\t$_" }

17voto

Chris Lutz Points 34157

Coller à la convention établie, je m'abstiendrai de nommer la langue utilisée ici:

+<,
[
  >[>+>+<<-]>>[<<+>>-]<[->+>+<<]>>[-<<+>>]+++++++++<
  [
    >>>+<<[>+>[-]<<-]>[<+>-]>[<<++++++++++>>>+<-]<<-<-
  ]
  >>>>[<<<<+>>>>-]<<<[-]<<[->>+>+<<<]>>>[-<<<+>>>]++++++++++++++++++++++++
  ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  ++++<
  [
    >>>+<<[>+>[-]<<-]>[<+>-]>
    [
      <<++++++++++++++++++++++++++++++++++++++++++++++++++++
      ++++++++++++++++++++++++++++++++++++++++++++++++>>>+<-
    ]
    <<-<-
  ]
  >>>>[<<<<+>>>>-]<<<[-]++++++++[-<++++++>]<.>++++++++[-<------>]<[->+<]
  >[-<++++++++++>]<[-<->]++++++++[-<++++++>]<.[-]<[>+>+<<-]>>[-<<+>>]
  +++++++++<
  [
    >>>+<<[>+>[-]<<-]>[<+>-]>[<<++++++++++>>>+<-]<<-<-
  ]
  >>>>[<<<<+>>>>-]<<<[-]<[->+<]>[-<++++++++++>]<[-<->]++++++++[-<++++++>]
  <.[-]+++++++++.<+<----------[++++++++++.,----------]++++++++++.[-],
]

Notes:

  • Suppose la mise en œuvre n'apporte aucun changement à la cellule expressions du FOLKLORE ou de jeux de la cellule à 0 sur les expressions du FOLKLORE.
  • Actuellement imprimer tous les nombres comme des zéros, nombres à trois chiffres.
  • Dans la plupart des implémentations de la langue, ce ne sera en mesure de compter jusqu'à 255, à quel point il s'enroule autour, et vous dire qu'il est sur la ligne 0. Si votre application n'a pas d'envelopper, d'en obtenir un nouveau.
  • La plupart de ce code est juste l'impression de la ligne numéro de la chaîne. Honnêtement, j'aurais pu faire beaucoup mieux si je le garde comme une chaîne de caractères dans la première place. Alors je n'aurais pas ces arbitraire numéro de la ligne d'emballages, et il serait plus facile à imprimer. Et probablement un enfer de beaucoup plus rapide.
  • En parlant de cela, ce programme dure 18 secondes à s'exécuter avec mon interprète (écrit en Perl, ce qui se traduit par source de Perl et eval()s le résultat) sur une 500 en ligne de fichier. Mon C interprète est cassé en ce moment, donc je ne peux pas donner un meilleur indice de référence.
  • Aussi, parait-il "200" est imprimé en tant que "1:0" et "100" comme "0:0". "000" (quand elle enveloppe) imprime très bien, quoique. J'ai peut-être besoin de faire un peu de peaufinage pour comprendre ce qui se passe avec ça, mais il est difficile d'avis que le programme est en cours d'exécution.

J'ai, à un moment donné, essayer de réécrire un peu mieux. Peut-être même avec des commentaires!

16voto

Martin Beckett Points 60406

DailyWTF

  1. Imprimer fichier
  2. Mettre sur une table en bois
  3. Photographie
  4. Coller dans Excel

Prograide.com

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.

Powered by:

X