编辑:谢谢大家。Python 解决方案运行速度极快 :)
我有一个看起来像这样的文件:
132,658,165,3216,8,798,651
但它要大得多(~ 600 kB)。没有换行符,除了文件末尾的换行符。
现在,我必须总结所有存在的值。我希望最终的结果会很大,但如果我用 C++ 总结它,我拥有一个 bignum 库,所以它应该不是问题。
我应该怎么做,用什么语言/程序?C++、Python、Bash?
编辑:谢谢大家。Python 解决方案运行速度极快 :)
我有一个看起来像这样的文件:
132,658,165,3216,8,798,651
但它要大得多(~ 600 kB)。没有换行符,除了文件末尾的换行符。
现在,我必须总结所有存在的值。我希望最终的结果会很大,但如果我用 C++ 总结它,我拥有一个 bignum 库,所以它应该不是问题。
我应该怎么做,用什么语言/程序?C++、Python、Bash?
sed -e 's/,/\n/g' tmp.txt | awk 'BEGIN {total=0} {total += $1} END {print total}'
Python
sum(map(int,open('file.dat').readline().split(',')))
只要你有一个 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
如果所有数字都小于 (2**64)/600000(仍然有 14 位数字),那么像 C 中的“long long”这样的 8 字节数据类型就足够了。该程序非常简单,使用您选择的语言。
由于将大量输入作为一个整体处理很昂贵,我建议你看看这篇文章。它解释了如何编写用于字符串拆分的生成器。它在 C# 中,但非常适合处理这种输入。
如果您担心总和不适合整数(例如 32 位),您可以轻松实现自己的 bignum,特别是如果您只使用整数和加法。只需将第 31 位带到下一个 dword 并继续添加。
如果精度不重要,只需将结果累加为双精度即可。那应该给你足够的范围。
http://www.koders.com/csharp/fid881E3E70CC37E480545A0C37C98BC8C208B06723.aspx?s=datatable#L12
一个快速的 C# CSV 解析器。我已经看到它很快就处理了几千个 1MB 的文件,我让它作为每月消耗大约 6000 个文件的服务的一部分运行。
无需重新发明一个快轮。
python可以处理大整数。
tr "," "\n" < file | any old script for summing
Ruby 很方便,因为它会自动处理大数字。我不记得 Awk 做了任意精度算术,但如果是这样,你可以使用
awk 'BEGIN {RS="," ; sum = 0 }
{sum += $1 }
END { print sum }' < file