Суммирование значений в однострочном файле, разделенном запятыми.
-
03-07-2019 - |
Вопрос
РЕДАКТИРОВАТЬ: Спасибо вам всем.Решение Python сработало молниеносно :)
У меня есть файл, который выглядит так:
132,658,165,3216,8,798,651
но это МНОГО больше (~ 600 КБ).Никаких новых строк, кроме одной в конце файла, нет.
И теперь мне нужно суммировать все имеющиеся значения.Я ожидаю, что конечный результат будет довольно большим, но если я суммирую его на C++, у меня есть библиотека bignum, так что это не должно быть проблемой.
Как мне это сделать и на каком языке/программе?С++, Питон, Баш?
Решение
Питон
sum(map(int,open('file.dat').readline().split(',')))
Другие советы
Пингвин Сед, «Авк»
sed -e 's/,/\n/g' tmp.txt | awk 'BEGIN {total=0} {total += $1} END {print total}'
Предположения
- Ваш файл — tmp.txt (очевидно, вы можете его отредактировать)
- Awk может обрабатывать такие большие числа
Язык не имеет значения, если у вас есть библиотека 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 цифр), 8-байтового типа данных, такого как «long long» в C, будет достаточно.Программа довольно проста, используйте язык по вашему выбору.
Поскольку обрабатывать такой большой ввод в целом дорого, я предлагаю вам взглянуть на этот почта.Он объясняет, как написать генератор для разделения строк.Он написан на C#, но хорошо подходит для обработки такого рода входных данных.
Если вы беспокоитесь о том, что общая сумма не умещается в целое число (скажем, 32-битное), вы можете так же легко реализовать большое число самостоятельно, особенно если вы просто используете целое число и сложение.Просто перенесите бит-31 в следующее двойное слово и продолжайте добавлять.
Если точность не важна, просто суммируйте результат в двойном размере.Это должно дать вам большой диапазон.
http://www.koders.com/csharp/fid881E3E70CC37E480545A0C37C98BC8C208B06723.aspx?s=datatable#L12
Быстрый парсер C# CSV.Я видел, как он довольно быстро обрабатывал несколько тысяч файлов размером 1 МБ. У меня он работает как часть службы, которая потребляет около 6000 файлов в месяц.
Не нужно изобретать быстрое колесо.
Python может обрабатывать большие целые числа.
tr "," "\n" < file | any old script for summing
Ruby удобен, поскольку он автоматически обрабатывает большие числа.Я не могу припомнить, чтобы Awk выполнял арифметические операции с произвольной точностью, но если это так, вы можете использовать
awk 'BEGIN {RS="," ; sum = 0 }
{sum += $1 }
END { print sum }' < file