在单行逗号分隔文件中对值求和

时间:2009-03-03 19:53:10

标签: file-io language-agnostic sum

编辑: 谢谢大家。 Python解决方案闪电般快速:)

我有一个看起来像这样的文件:

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

但是 MUCH 更大(~600 kB)。没有换行符,除了文件末尾的换行符。

现在,我必须总结那里的所有价值观。我希望最终的结果非常大,但是如果我用C ++总结它,我就拥有一个bignum库,所以它应该不是问题。

我该怎么做,用什么语言/程序? C ++,Python,Bash?

8 个答案:

答案 0 :(得分:6)

Penguin Sed,“Awk”

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

假设

  • 您的文件是tmp.txt(显然可以编辑)
  • Awk可以处理大数

答案 1 :(得分:4)

的Python

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

答案 2 :(得分:1)

只要你有一个bignum图书馆,语言无关紧要。粗略的伪代码解决方案是:

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

答案 3 :(得分:1)

如果所有数字都小于(2 ** 64)/ 600000(仍有14位数字),则C中的“long long”等8字节数据类型就足够了。该计划非常简单,使用您选择的语言。

答案 4 :(得分:0)

由于整体处理大量输入的费用很高,我建议您查看this帖子。它解释了如何编写用于字符串拆分的生成器。它在C#中,但它非常适合通过这种输入进行处理。

如果您担心总和不适合整数(比如32位),您可以轻松地实现自己的bignum,特别是如果您只使用整数和加法。只需将bit-31带到下一个dword并继续添加。

如果精度不重要,只需将结果累加为double。这应该给你足够的范围。

答案 5 :(得分:0)

http://www.koders.com/csharp/fid881E3E70CC37E480545A0C37C98BC8C208B06723.aspx?s=datatable#L12

快速C#CSV解析器。我已经看到它很快就会破坏几千个1MB文件,我将它作为服务的一部分运行,每月消耗大约6000个文件。

无需重新发明快轮。

答案 6 :(得分:-1)

python可以处理大整数。

答案 7 :(得分:-1)

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

Ruby很方便,因为它会自动处理大数字。我不记得Awk是否具有任意精度算术,但如果是这样,你可以使用

awk 'BEGIN {RS="," ; sum = 0 }
     {sum += $1 }
     END { print sum }' < file