3

编辑:谢谢大家。Python 解决方案运行速度极快 :)

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

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

但它要大得多(~ 600 kB)。没有换行符,除了文件末尾的换行符。

现在,我必须总结所有存在的值。我希望最终的结果会很大,但如果我用 C++ 总结它,我拥有一个 bignum 库,所以它应该不是问题。

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

4

8 回答 8

6

企鹅赛德,“Awk”

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

假设

  • 你的文件是 tmp.txt (你可以很明显地编辑它)
  • awk 可以处理这么大的数字
于 2009-03-03T20:08:15.007 回答
4

Python

sum(map(int,open('file.dat').readline().split(',')))
于 2009-03-03T20:14:31.573 回答
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
于 2009-03-03T19:57:53.360 回答
1

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

于 2009-03-03T19:59:06.573 回答
0

由于将大量输入作为一个整体处理很昂贵,我建议你看看这篇文章。它解释了如何编写用于字符串拆分的生成器。它在 C# 中,但非常适合处理这种输入。

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

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

于 2009-03-03T20:00:43.153 回答
0

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

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

无需重新发明一个快轮。

于 2009-03-03T20:09:14.223 回答
-1

python可以处理大整数。

于 2009-03-03T19:59:54.480 回答
-1
tr "," "\n" < file | any old script for summing

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

awk 'BEGIN {RS="," ; sum = 0 }
     {sum += $1 }
     END { print sum }' < file
于 2009-03-03T20:08:32.243 回答