Суммирование значений в однострочном файле с разделителями-запятыми - PullRequest
3 голосов
/ 03 марта 2009

РЕДАКТИРОВАТЬ: Спасибо всем вам. Решение Python работало молниеносно:)

У меня есть файл, который выглядит так:

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

но это НАМНОГО больше (~ 600 кБ). Новых строк нет, кроме одной в конце файла.

А теперь я должен суммировать все значения, которые есть. Я ожидаю, что конечный результат будет довольно большим, но если бы я суммировал его в C ++, у меня была бы библиотека bignum, так что это не должно быть проблемой.

Как мне это сделать и на каком языке / программе? C ++, Python, Bash?

Ответы [ 8 ]

6 голосов
/ 03 марта 2009

Пингвин Сед, "Awk"

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

Предположения

  • Ваш файл - tmp.txt (вы можете редактировать это очевидно)
  • Awk может работать с большими числами
4 голосов
/ 03 марта 2009

Python

sum(map(int,open('file.dat').readline().split(',')))
1 голос
/ 03 марта 2009

Если все числа меньше, чем (2 ** 64) / 600000 (который по-прежнему имеет 14 цифр), 8-байтового типа данных типа «long long» в C будет достаточно. Программа довольно проста, используйте язык по вашему выбору.

1 голос
/ 03 марта 2009

Язык не имеет значения, если у вас есть библиотека 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
0 голосов
/ 03 марта 2009

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

Быстрый синтаксический анализатор C # CSV. Я видел, как он довольно быстро обрабатывает несколько тысяч файлов размером 1 МБ, и он работает как часть службы, которая потребляет около 6000 файлов в месяц.

Не нужно изобретать быстрое колесо.

0 голосов
/ 03 марта 2009
tr "," "\n" < file | any old script for summing

Ruby удобен, так как он автоматически обрабатывает большие числа. Я не могу вспомнить, что Awk выполняет произвольную арифметическую точность, но если это так, вы можете использовать

awk 'BEGIN {RS="," ; sum = 0 }
     {sum += $1 }
     END { print sum }' < file
0 голосов
/ 03 марта 2009

Поскольку рассматривать этот большой вклад в целом дорого, я предлагаю вам взглянуть на этот пост. Он объясняет, как написать генератор для разделения строк. Это в C #, но оно хорошо подходит для обработки такого рода ввода.

Если вас беспокоит, что общая сумма не помещается в целое число (скажем, 32-разрядное), вы можете так же легко реализовать bignum самостоятельно, особенно если вы просто используете целое число и сложение. Просто перенесите бит-31 к следующему мечу и продолжайте добавлять.

Если точность не важна, просто накапливайте результат в два раза. Это должно дать вам много возможностей.

0 голосов
/ 03 марта 2009

Python может обрабатывать большие целые числа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...