Résumer les valeurs dans un fichier d'une ligne délimité par des virgules
-
03-07-2019 - |
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?
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