Question

MODIFIER: Merci à vous tous. La solution Python a fonctionné à la vitesse de l’éclair:)

J'ai un fichier qui ressemble à ceci:

132,658,165,3216,8,798,651

mais BEAUCOUP est plus grand (~ 600 Ko). Il n'y a pas de saut de ligne, sauf un en fin de fichier.

Et maintenant, je dois faire la somme de toutes les valeurs présentes. Je m'attends à ce que le résultat final soit assez important, mais si je le résumais en C ++, je possède une bibliothèque bignum, ce qui ne devrait donc pas poser de problème.

Comment dois-je faire cela et dans quelle langue / quel programme? C ++, Python, Bash?

Était-ce utile?

La solution

Python

sum(map(int,open('file.dat').readline().split(',')))

Autres conseils

Penguin Sed, "Awk"

sed -e 's/,/\n/g' tmp.txt | awk 'BEGIN {total=0} {total += $1} END {print total}'

Hypothèses

  • Votre fichier est tmp.txt (vous pouvez le modifier évidemment)
  • Awk peut gérer des nombres aussi gros

La langue n'a pas d'importance, tant que vous avez une bibliothèque bignum. Une solution approximative de pseudo-code serait:

str = ""
sum = 0
while input
    get character from input
    if character is not ','
        append character to back of str
    else
        convert str to number
        add number to sum
        str = ""
output sum

Si tous les nombres sont inférieurs à (2 ** 64) / 600000 (qui a encore 14 chiffres), un type de données de 8 octets tel que "long long" en C sera suffisant. Le programme est assez simple, utilisez la langue de votre choix.

Puisqu'il est coûteux de traiter cette entrée volumineuse dans son ensemble, je vous suggère de jeter un coup d'œil à this post. Il explique comment écrire un générateur pour le fractionnement de chaînes. Il est en C # mais convient parfaitement pour ce type d’informations.

Si vous êtes inquiet au sujet de la somme totale pour ne pas tenir dans un entier (disons 32 bits), vous pouvez tout aussi facilement implémenter un bignum vous-même, surtout si vous utilisez uniquement un entier et une addition. Il suffit de porter le bit 31 au prochain mot et de continuer à l'ajouter.

Si la précision n'a pas d'importance, accumulez simplement le résultat dans un double. Cela devrait vous donner beaucoup de portée.

hr .aspx? s = datatable # L12

Un analyseur CSV rapide en C #. Je l'ai déjà vu traiter rapidement quelques milliers de fichiers de 1 Mo. Je l'ai utilisé dans le cadre d'un service qui consomme environ 6000 fichiers par mois.

Inutile de réinventer la roue rapide.

python peut gérer les grands entiers.

tr "," "\n" < file | any old script for summing

Ruby est pratique car il gère automatiquement les grands nombres. Je ne me souviens pas de Awk fait arithmentic précision arbitraire, mais si oui, vous pouvez utiliser

awk 'BEGIN {RS="," ; sum = 0 }
     {sum += $1 }
     END { print sum }' < file
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top