Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Парс строк... нужен алгоритм 
:(
    Опции темы
Palladin
Дата 25.5.2009, 09:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 932
Регистрация: 15.5.2007
Где: Беларусь г.Гомель

Репутация: 3
Всего: 17



Пишу программу, осталась последняя не реализованная задача. Собстно в программе необходимо сделать выгрузку в .txt файл
В него записи из таблицы БД переносятся и принимают подобный вид:
Код

1827;07;2009;8.12;8.12;В;9.12;4.08;8.12;8.12;О;9.12;4.08;8.12;8.12;В;9.12;4.08;8.12;8.12;В;9.12;4.08;8.12;8.12;В;9.12;4.08;0;20;45;0;

(пример выгрузки, ну стркоа сверху, и дальше по тексту, написана тут на форуме и кол-во разделителей не соответсвует истинному значению. Кол-во разделителей равна 3+кол-во дней в месяце+4) кол-во денй в месяце в программе хранится в глобальной переменной day_of_month

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

.......................................
1819;07;2009;8.12;8.12;В;9.12;4.08;8.12;8.12;О;9.12;4.08;8.12;8.12;В;9.12;4.08;8.12;8.12;В;9.12;4.08;8.12;8.12;В;9.12;4.08;0;20;45;0;
1827;07;2009;8.12;8.12;В;9.12;4.08;8.12;8.12;О;9.12;4.08;8.12;8.12;В;9.12;4.08;8.12;8.12;В;9.12;4.08;8.12;8.12;В;9.12;4.08;0;20;45;0;
1827;07;2009;8.12;8.12;В;9.12;4.08;8.12;8.12;О;9.12;4.08;8.12;8.12;В;9.12;4.08;8.12;8.12;В;9.12;4.08;8.12;8.12;В;9.12;4.08;0;20;45;0;
1837;07;2009;8.12;8.12;В;9.12;4.08;8.12;8.12;О;9.12;4.08;8.12;8.12;В;9.12;4.08;8.12;8.12;В;9.12;4.08;8.12;8.12;В;9.12;4.08;0;20;45;0;
 ..............................

записатся должно:
.......................................
1819;07;2009;8.12;8.12;В;9.12;4.08;8.12;8.12;О;9.12;4.08;8.12;8.12;В;9.12;4.08;8.12;8.12;В;9.12;4.08;8.12;8.12;В;9.12;4.08;0;20;45;0;
1827;07;2009;16.24;16.24;В;18.24;8.16;16.24;16.24;О;18.24;8.16;16.24;16.24;В;18.24;8.16;16.24;16.24;В;18.24;8.16;16.24;16.24;В;18.24;8.16;0;40;90;0;
1837;07;2009;8.12;8.12;В;9.12;4.08;8.12;8.12;О;9.12;4.08;8.12;8.12;В;9.12;4.08;8.12;8.12;В;9.12;4.08;8.12;8.12;В;9.12;4.08;0;20;45;0;
 ..............................

Если в двух одинаковых строках, по одному и тому же элементу, в одной строке буква, а в другой цифра, выдать ошибку мол, проверьте корректность ввода данных, но это ясное дело я сам сделаю, никак не удается написать код до конца, алгоритм у меня видать туповат, когда дохожу до середины все в голове перемешивается и все по новой приходится переписывать smile 

Вообщем имеем файл file.txt в нем строки как показано выше, если инвентарные номера равны в двух и более строках сложить, то что после 3 точки с запятой, если не равны просто оставить без изменений...

Кто поможет с кодом или толковым алгоритмом, получит 3 плюса, а так же мою неимоверную благодарность, запарился уже честно
Выкладывать свой код, не буду(ну только если действительно понадобится), т.к. не хочу чтобы вы машинально повторяли мой путь, быть может он ошибочный smile 
P.S. трейти день пытаюсь сделать smile  smile  smile 


--------------------
Глуп тот кто полагается на истину авторитета, а не на авторитет истины
[color=red]KAV&KIS==Evil[/color]
PM MAIL   Вверх
Frees
Дата 25.5.2009, 10:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2233
Регистрация: 2.12.2005
Где: Екатеринбург

Репутация: 9
Всего: 54



многа букв написал..

попробуй выгружать в более человечный формат csv например или xml


--------------------
Кольцов Виктор Владимирович
PM MAIL ICQ   Вверх
Palladin
Дата 25.5.2009, 10:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 932
Регистрация: 15.5.2007
Где: Беларусь г.Гомель

Репутация: 3
Всего: 17



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


--------------------
Глуп тот кто полагается на истину авторитета, а не на авторитет истины
[color=red]KAV&KIS==Evil[/color]
PM MAIL   Вверх
Akella
Дата 25.5.2009, 10:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



Цитата(Palladin @  25.5.2009,  09:34 Найти цитируемый пост)
(пример выгрузки, ну стркоа сверху, и дальше по тексту, написана тут на форуме и кол-во разделителей не соответсвует истинному значению. Кол-во разделителей равна 3+кол-во дней в месяце+4) кол-во денй в месяце в программе хранится в глобальной переменной day_of_month


Palladin, попробуй сам прочитать  smile 
PM MAIL   Вверх
Palladin
Дата 25.5.2009, 10:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 932
Регистрация: 15.5.2007
Где: Беларусь г.Гомель

Репутация: 3
Всего: 17



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


--------------------
Глуп тот кто полагается на истину авторитета, а не на авторитет истины
[color=red]KAV&KIS==Evil[/color]
PM MAIL   Вверх
Akella
Дата 25.5.2009, 10:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



Цитата(Palladin @  25.5.2009,  09:34 Найти цитируемый пост)
1827;07;2009;8.12;8.12;В;9.12;4.08;8.12;8.12;О;9.12;4.08;8.12;8.12;В;9.12;4.08;8.12;8.12;В;9.12;4.08;8.12;8.12;В;9.12;4.08;0;20;45;0;
1827;07;2009;8.12;8.12;В;9.12;4.08;8.12;8.12;О;9.12;4.08;8.12;8.12;В;9.12;4.08;8.12;8.12;В;9.12;4.08;8.12;8.12;В;9.12;4.08;0;20;45;0;

что именно суммировать?
PM MAIL   Вверх
Palladin
Дата 25.5.2009, 10:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 932
Регистрация: 15.5.2007
Где: Беларусь г.Гомель

Репутация: 3
Всего: 17



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

Добавлено @ 10:15
вообщем до первой точки с запятой идет инвентарный номер, его не суммируем, потом идет месяц, его тоже не суммируем, потом год его тоже не суммируем, остальное все суммируем, если это возможно, в случае если это не возможно выдать ошибку мол проверьте корректно ли введены данные

Добавлено @ 10:16
суммируем только те строки в которых инвентарные номера идентичны

Это сообщение отредактировал(а) Palladin - 25.5.2009, 10:17


--------------------
Глуп тот кто полагается на истину авторитета, а не на авторитет истины
[color=red]KAV&KIS==Evil[/color]
PM MAIL   Вверх
Akella
Дата 25.5.2009, 10:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



Проблема-то в чём? Не получается складывать?
PM MAIL   Вверх
Palladin
Дата 25.5.2009, 10:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 932
Регистрация: 15.5.2007
Где: Беларусь г.Гомель

Репутация: 3
Всего: 17



Да замучался просто, последнйи месяц вообще не отдыхаю, уже голова не работает, плюс лень наверное, т.к. после этого куска кода в отпуск... Незнаю, может отупел, вроде все понятно, а начинаю и никак закончить не могу, жесть какаята, первый раз такое...


--------------------
Глуп тот кто полагается на истину авторитета, а не на авторитет истины
[color=red]KAV&KIS==Evil[/color]
PM MAIL   Вверх
Akella
Дата 25.5.2009, 10:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



Может можно всё вставить во временную таблицу, затем суммировать нужные поля с использованием группировки? Может даже без временной таблицы?

Код

select inv_nomer, year1, mounth1, sum(pole1), pole2, sum(pole3)
group by 1, 2, 4

 smile  smile 
PM MAIL   Вверх
Palladin
Дата 25.5.2009, 10:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 932
Регистрация: 15.5.2007
Где: Беларусь г.Гомель

Репутация: 3
Всего: 17



SQL так и не освоил+юзаю ADOTable, а так же как тут проверить возможно ли суммирование? если буква+число надо дать ошибку, если число+ число, надо корректно сложить, ибо вот эти числа 8.12 и т.п. эт восемь часов двенадцать минут, т.е. надо минуты еще аккуратно слаживать и т.п. заморочки...


--------------------
Глуп тот кто полагается на истину авторитета, а не на авторитет истины
[color=red]KAV&KIS==Evil[/color]
PM MAIL   Вверх
CodeMonkey
Дата 25.5.2009, 11:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 38
Всего: 89



Если я правильно понял, то, наверное, надо сделать как-то так (если без БД):
Код
function CountChars(const AStr: String; const AChar: Char): Integer;
begin
  Result := 0;
  for X := 1 to Length(AStr) do
    Result := Result + Ord(AStr[X] = AChar);
end;

var
  Str: TStringList;
  Src: array of array of String;
  Dst: array of array of String; // можно Variant
  S: String;
  X, Y, ZCnt: Integer;
  B1, B2: Boolean;
  V1, V2: Extended; 
begin
  Str := TStringList.Create;
  try
    // загрузили из файла строки
    Str.LoadFromFile('...');

    SetLenth(Src, Str.Count);
    try
      // загоняем данные в массив
      for X := 0 to Str.Count - 1 do
      begin
        // первая строка определяет набор полей, остальные должны ей соответствовать
        if X = 0 then
        begin
          FieldCnt := CountChars(Str[X], ';') + 1;
          if FieldCnt <= 3 then
            raise Exception.Create('В файле слишком мало ; в первой строке.');
        end 
        else
          if FieldCnt <> CountChars(Str[X], ';') + 1 then
            raise Exception.Create('В строке №' + IntToStr(X + 1) + ' число разделителей не соответствует первой строке.');

        // перегоняем строку с ; в набор полей (массив)
        SetLength(Src[X], FieldCnt);
        S := Src[X];
        Y := Pos(';', S);
        Z := 0;
        while Y > 0 do
        begin
          Src[X][Z] := Trim(Copy(S, 1, Y - 1));
          S := Trim(Copy(S, Y + 1, MaxInt));
          Y := Pos(';', S);
          Inc(Z);
        end; 
        Src[X][Z] := S;
      end;

      // сортируем массив (не стал выписывать - сделаете сами)
      SortArray(Src, 0, Str.Count - 1); 

      // суммируем данные      
      SetLength(Dst, Str.Count - 1);
      try
        Cnt := 0;
        for X := 0 to Str.Count - 1 do
        begin
          // новая строка?
          if (Cnt = 0) or (Src[X][0] <> Dst[Cnt - 1][0]) then
          begin
            for Y := 0 to FieldCnt - 1 do
              Dst[Cnt][Y] := Src[X][Y];
            Inc(Cnt); 
          end
          else
          begin
            Dst[Cnt][1] := Src[X][1]; // месяц-год копировать или как?
            Dst[Cnt][2] := Src[X][2]; 
            for Y := 3 to FieldCnt - 1 do
            begin
              B1 := TryStrToFloat(Src[X][Y], V1);
              B2 := TryStrToFloat(Dst[X][Y], V2);
              if B1 <> B2 then
                raise Exception.Create('Возникло какое-то ГГ в строках X - 1 и X в поле Y.');   
              if B1 then
                Dst[Cnt][Y] := FloatToStr(V1 + V2)  // числа
              else
                Dst[Cnt][Y] := Src[X][Y];                  // не числа
            end;
            
          end;
        end;
        SetLength(Dst, Cnt);
    
        // Здесь: Dst - готовые данные

      finally
        Finalize(Dst); 
      end;
    finally
      Finalize(Src);
    end;
  finally
    FreeAndNil(Str);
  end;
end;




--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
Palladin
Дата 25.5.2009, 12:14 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 932
Регистрация: 15.5.2007
Где: Беларусь г.Гомель

Репутация: 3
Всего: 17



2CodeMonkey ты монстр, сейчас буду проверять... smile 


--------------------
Глуп тот кто полагается на истину авторитета, а не на авторитет истины
[color=red]KAV&KIS==Evil[/color]
PM MAIL   Вверх
CodeMonkey
Дата 25.5.2009, 12:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 38
Всего: 89



Делал на коленке, без компилятора - так что там, скорее всего, ошибки. Просто демонстрация подхода, как можно сделать.


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
Palladin
Дата 25.5.2009, 12:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 932
Регистрация: 15.5.2007
Где: Беларусь г.Гомель

Репутация: 3
Всего: 17



Было пару, не объявленных переменных, но эт мелочи, сейчас стопорюсь на этой строке:
Код

S :=Src[X];

ошибка:
Код

[Error] Unit1.pas(2604): Incompatible types: 'String' and 'dynamic array'


В делфи с динамическими массивами не работал, такчто незнаю как исправить...

Добавлено через 9 минут и 31 секунду
И функцию SortArray тож если можешь выложи...
P.S. наглею...


--------------------
Глуп тот кто полагается на истину авторитета, а не на авторитет истины
[color=red]KAV&KIS==Evil[/color]
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0613 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.