Суммирование значений в однострочном файле, разделенном запятыми.

StackOverflow https://stackoverflow.com/questions/607879

  •  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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top