Обработка и гурппировка данных из текстового файла - как лучше?

Автор Finntroll, 04 Серпень 2008, 11:35:22

Попередня тема - Наступна тема

Finntroll

Столкнулся вот с такой задачей:

Есть обычный текстовый файл, в котором много строк, каждая из которых представляет из себя следующее:

Дата Время Человек покупает количество товар за Стоимость

Таких строчек может быть множество, как и видов товаров и покупателей


Как наиболее просто, быстро и с помощью чего можно сгруппировать одинаковые виды товара и узнать общее количество проданного по видам, не делая это вручную?

Leka

В текстовом файле наверное никак, потому что данные представляют собой сплошной текст. Вот если была бы таблица разбитая на поля, тогда без проблем можно было бы группировать данные в том же Exel или Access.

Finntroll

В этом то и задача состоит...увы... иначе бы и не спрашивал... может быть можно некий макрос написать, в котором одинаковые фразы бы учитывались и ссумировалось количество - ведь структура текста строк везде одинакова

Leon

А скопировать и перенести в Excel? По идее разделит на ячейки
Цитата: Finntroll від 04 Серпень 2008, 11:35:22
Дата Время Человек покупает количество товар за Стоимость
как так?

Finntroll

Я думал об этом, но пока не могу решить проблему: товар состоит из нескольких слов и их количество не одинаково.....может быть 2 ..может 5-ть...
при экспорте в эксель ячейка дробиться...

и Человек разной длины как и стоимость

Неизменным остается только сам формат строки, формат и длина даты, слово "покупает" и слово "за"

может быть как-то от этих постоянных можно было бы плясать...
Если бы можно было создать какую-то обработку с условиями вроде:
Анализируем строку:

Дата Время Человек покупает количество Товар за Стоимость

1) Дату и Время - поместить в ячейки дата и время
2) все что после Время и до слова "покупает" -  это Человек, а значит поместить это в отдельную ячейку Человек.
3) Количество - поместить в количество (цифра)
4) Все, что между количеством и словом "за" =  Товар
5) все остальное -Стоимость...

Но как и где это сделать...без понятия :(

Garfi

В С++ можно отсортировать твой текстовый файл так, как ты хочешь. ;)

Finntroll

Ты предлагаешь мне изучить С++ прямо сейчас или предлагаешь помощь в виде написания того, о чем мы говорим? ;)

Edd.Dragon

Цитата: Finntroll від 05 Серпень 2008, 08:37:50
Я думал об этом, но пока не могу решить проблему: товар состоит из нескольких слов и их количество не одинаково.....может быть 2 ..может 5-ть...
при экспорте в эксель ячейка дробиться...

и Человек разной длины как и стоимость

Неизменным остается только сам формат строки, формат и длина даты, слово "покупает" и слово "за"
Если в текстовом файле что-то типа

Alex Moralex Car 100
Fintroll Super Car 200

то и человек не поймет, что такое Super - фамилия или часть наименования товара. Если человек не поймет, то машина тем более - в таком случае нет формата строки, а есть куча мала с которой никто ничего не сделает.

Если же там столбики разделяют табуляции, а не пробелы - тогда при импорте это Excel-у и указываем. Или файл форматирован так, что столбцы имеют фиксированую ширину - тоже без проблем.

Finntroll

Немного не так...Человек  - всегда одно слово, но разной длинны.
К примеру:
05/08/2008 10:56 Вася покупает 1 рулон туалетной бумаги за 5грн, 92коп
05/08/2008 10:35 Петрович покупает 2 утюг за 13грн, 41коп
05/08/2008 10:35 Голохвастов покупает 2 утюг за 15грн, 40коп
05/08/2008 10:55 Свиридов покупает 5 толстая сосиска за 7грн, 97коп

поэтому, собственно, структура и закономерность вроде бы отслеживается, но увы - в эксель просто так через импорт с разделением столбцов не перенесешь... и, увы, все разделено пробелами...

И задача, повторюсь, даже не разложить все по полочкам, а подбить итог - сколько и чего продалось. Даже не важно кому и за сколько (хотя если и это возможно - то будет еще удобнее, но не главное).

Главное  - название и колличество.
Получить на выходе что-то вроде этого:

1 рулон туалетной бумаги
4 утюг
5 толстая сосиска

βεερ_βooρ

Цитата: Finntroll від 07 Серпень 2008, 09:11:38
Немного не так...Человек  - всегда одно слово, но разной длинны.
К примеру:
05/08/2008 10:56 Вася покупает 1 рулон туалетной бумаги за 5грн, 92коп
05/08/2008 10:35 Петрович покупает 2 утюг за 13грн, 41коп
05/08/2008 10:35 Голохвастов покупает 2 утюг за 15грн, 40коп
05/08/2008 10:55 Свиридов покупает 5 толстая сосиска за 7грн, 97коп

поэтому, собственно, структура и закономерность вроде бы отслеживается, но увы - в эксель просто так через импорт с разделением столбцов не перенесешь... и, увы, все разделено пробелами...

И задача, повторюсь, даже не разложить все по полочкам, а подбить итог - сколько и чего продалось. Даже не важно кому и за сколько (хотя если и это возможно - то будет еще удобнее, но не главное).

Главное  - название и колличество.
Получить на выходе что-то вроде этого:

1 рулон туалетной бумаги
4 утюг
5 толстая сосиска
Ну тогда в чем проблема?
#!/bin/sh
bc_q="0"
echo "Введите название товара:"
read name
arr=`cat sales.txt|grep "$name"|cut -d' ' -f5|sed -n 'H;${x;s/\n/ /g;p}'`
for i in $arr
do
bc_q="$bc_q + $i"
done
echo $bc_q|bc

Содержимое тестового sales.txt:
05/08/2008 10:56 Вася покупает 1 рулон туалетной бумаги за 5грн, 92коп
05/08/2008 10:35 Петрович покупает 2 утюг за 13грн, 41коп
05/08/2008 10:35 Голохвастов покупает 2 утюг за 15грн, 40коп
05/08/2008 10:55 Свиридов покупает 5 толстая сосиска за 7грн, 97коп

Результат работы:
bash-3.1$ ./sales.sh
Введите название товара:
утюг
4
bash-3.1$ ./sales.sh
Введите название товара:
толстая сосиска
5

Порт классических Unix-утилит можно взять тут: http://unxutils.sourceforge.net/
Fear is the path to the dark side. Fear leads to anger. Anger leads to hate. Hate leads to suffering.
All that's here is Fear! Suppression! Betrayal! Despair! Contempt! Regret! Sadness! Anguish! Madness! And Pain, right?

Edd.Dragon

А, понятно, т.е. получаем следующую логику - сначала дата, через пробелы время, далее между пробелами и словом "покупает" - клиент, далее кол-во, потом до слова "за" - товар, остаток строки - цена, состоящая или из одного числа (32,54), или из двух чисел - целое и копейки, разделенные некими словами (например, грн и коп или чем-то еще).

Тогда конечно лучше переформатировать программно. Можно например в том же Бейсике экселевском. У меня под рукой есть Дельфи - вот результат:
http://rapidshare.com/files/135523120/reformat.exe.html (залил сюда, т.к. UAGet дико тормозит)

Запускаем с командной строки (для удобства прогу кинуть в папку с текстовыми файлами), указывая имена текстовых файлов в качестве параметров запуска. Например, reformat 1.txt 2.txt - на выходе получим два новых файла new.1.txt new.2.txt с нормальным для Excel форматированием через табуляции. Ну а уже в Экселе импортируй, суммируй, фильтруй и крути как хочешь.

P.S.: Количество никак не преобразуется, т.к. ты не привел примера дробных количеств. А суммы преобразуются по принципу: строки "13грн, 41коп", "13 hz_chego, 41", "13, 41", "13,41", "13.41" на выходе дадут 13,41. Уточни как выглядят суммы типа 0,41, т.е. "0грн, 41коп" или "41коп" - на данный момент для правильного результата просто "41коп" не подходит. Если надо исправлю. Т.е. дай более точную инфу.

Finntroll

Цитата: beep_boop від 07 Серпень 2008, 13:42:11
Порт классических Unix-утилит можно взять тут: http://unxutils.sourceforge.net/

Эммм... как я понял суть твоего метода заключалась в том, чтобы вручную по одному вписывать названия товаров? ... но это, увы, немного не то - слишком много позиций может быть... утомительно.
ЗЫ: В любом случае проверить не смог, так как по этой ссылке на страничке с загрузкой идет ошибка - файл отсутствует.

edd_k - проверь личку, я там все выслал тебе  :)

Anton T.

Тебе сделать в Access?
Тогда да, это все просто и очень легко ;) Создаем таблицу в режиме конструктора и впишите "Имя поля" заказчика и тип данных, сохраняем. Так идем в Запросы создаем конструктор, при создание выдает "Добавление таблицы" добавляем таблицу и закрой, перейдем в режим SQL (в меню Вид - Режим SQL) и впишите сюда:
SELECT человек,  товар, sum([количество]) AS [всего штук], sum([стоимость]) AS [цена всего]
FROM Таблица1
GROUP BY  человек, товар;

Если кому надо, примеры выложил. см аттач zakaz.zip ;)

P.S. Выдели курсор GROUP и жми F1 вызывается справка "группировка" ;)

Добавлено:
Если надо импортировать из текстового файла в аксесс, надо сделать ; (точка с запятой), например:
05/08/2008;10:56;Вася;1;рулон туалетной бумаги;5,92


[вложение удалено, т.к. кончилось места на сервере]

Edd.Dragon

Цитата: AntonT від 08 Серпень 2008, 16:44:15
Тебе сделать в Access?
Добавлено:
Если надо импортировать из текстового файла в аксесс, надо сделать ; (точка с запятой), например:
05/08/2008;10:56;Вася;1;рулон туалетной бумаги;5,92

Антон, читай внимательно - сгруппировать и посчитать тоталы разобранных данных - это не проблема в данной теме :)

Проблема - исходные данные, которые надо импортировать. Есть текстовый файл. Который создается вовсе не Finntroll и на его формат он повлиять не может. И суть как раз импортировать из этого файла с имеющимся форматом правильно. Точек запятых и табуляций там нет - одни пробелы. Пример файла выше.

Phantom of the Opera

#14
Попробуй що я нашкрябав 8):
http://rapidshare.com/files/136523154/TovarDPK.exe.html (Файл EXE - переіменуй)
Відпишись чи все ОК і протестуй програму на помилки.
PS: відкривай текстовий файл (про який ти говорив спочатку)
"Мыслящий ум - тот, который постоянно учится, никогда не делая заключений; стили и шаблоны уже приведены к заключениям, и, таким образом, они не могут способствовать мышлению." Брюс Лі

Finntroll

Что могу сказать, парни, вы просто гении :)
Спасибо всем, кто откликнулся - я даже не ожидал, что кто-то не просто советом поможет, но еще и программку напишет, да еще и подгонит, потестирует со мной и т.п.

Каждый вариант, что от edd_k, что от Phantom of the Opera хорош.
У Фантома удобный "интерфейс"  - программка скромно и четко выполняет весь тот минимальный набор, что мне и требовался.

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

В общем, каждый вариант удобен для тех или иных случаев, молодцы парни, а от меня вам низкий поклон и огромнейшее спасибо за помощь.
Вы даже не представляете от какого гемороя меня избавили :)

Снимаю шляпу перед вами!  :%) :)

ЗЫ: я думаю если они захотят, то выложат свои окончательные варианты (которые высылали периодически мне) сюда в темку, в любом случае, еще раз спасибо.