Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Разное > Работа: предложения и спрос
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 21.11.2018, 19:06
val-tal val-tal вне форума
Прохожий
 
Регистрация: 21.11.2018
Сообщения: 3
Версия Delphi: Delphi7
Репутация: 10
По умолчанию Доработать, исправить код

задача такая, среда Delphi7-Имеется Memo с некими строками типа :

болт=1 //(болт-название, 1- количество)
машина=4
булка=3
пустая строка

и имеется текстовый файл пустой! или со строками типа:
12.12.2018
компот=2
болт=1
машина =1
пустая строка

Задание: нужно пройтись по Мемо по всем строкам , найти в файле совпадения типа
болт=болт и сложить их количество и перезаписать исходный файл с новыми значениями количества,
если в файле нет совпадения типа "Болт"="Болт""
. то просто добавить в файл такую строку

В этом примере в файле должны быть записаны получившиеся строки
12.12.2018
болт=2
машина=5
булка=3
компот=2

Оплата:
1. Вы мне присылаете на почту exe-шник, я проверяю работоспособность кода
2. Если меня все устраивает в коде, отправляю вам деньги-вы мне исходный код
Кусок кода я вам предоставляю, вы его исправляете, дополняете и т.д.
Базы данных не предлагать и прочие хеш таблицы, только Мемо и текстовый файл (такие условия)
со мной связаться если после 17-00 в аське 699297384 или днем на мыло val-tal35@mail.ru
Ответить с цитированием
  #2  
Старый 22.11.2018, 00:44
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,057
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Обычный TStringList или простой самописный массив решат твою задачу.
Алгоритм примерно такой (кстати, собственно тут тебе нужен map/hashmap):
1. Читаем файл, разбираем все строки и запоминаем (в TStringList или в массиве, как удобнее) пары имя=значение.
2. Так же разбираем строки из Memo, только всесто запоминания добавляем в существующие или новые.
3. Сохраняем из массива все обратно в файл с простановкой новой даты.
Ответить с цитированием
  #3  
Старый 22.11.2018, 00:58
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,057
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Аот весь код для твоей задачи:
Код:
type
  TMyData = record
    Name : String;
	QT : Integer;
  end;
  
procedure ProcessData(AFileName : String; AMemo : TMemo);
var
  A : Array of  TMyData;
  SL : TStringList;
  I : Integer;
  sName, sQT : String;
  
  function FindItem(AName : String) : Integer;
  var
    K : Integer;
  begin
    Result := -1;
    For K := Low(A) To High(A) Do
	  If AName = A[K].Name Then
	    Begin
		  Result := K;
		  Break;
		End;
	If Result = -1 Then
	  Begin
	    SetLength(A,Length(A)+1);
		Result := High(A);
		A[Result].Name := AName;
		A[Result].QT := 0;
	  End;
  end;
  
begin
  SetLength(A,0); // just in case
  SL := TStringList.Create;
  Try
    // Load file and process it
    SL.LoadFromFile(AFileName);
	For I := 0 To SL.Count-1 Do
	  If Pos('=',SL[i]) > 0 Then
		Begin
		  sName := Copy(SL[i],1,Pos('=',SL[i])-1);
		  sQT := Copy(SL[i],Pos('=',SL[i])+1,Length(SL[i])-Pos('=',SL[i]));
		  Idx := FindItem(sName);
		  A[Idx].QT := A[Idx].QT + StrToInt(sQT);
		End;
		
	// Now adding data from TMemo
	For I := 0 To AMemo.Lines.Count-1 Do
	  If Pos('=',AMemo.Lines[i]) > 0 Then
		Begin
		  sName := Copy(AMemo.Lines[i],1,Pos('=',AMemo.Lines[i])-1);
		  sQT := Copy(AMemo.Lines[i],Pos('=',AMemo.Lines[i])+1,Length(AMemo.Lines[i])-Pos('=',AMemo.Lines[i]));
		  Idx := FindItem(sName);
		  A[Idx].QT := A[Idx].QT + StrToInt(sQT);
		End;
  
	// And finally save the result into the same file
	SL.Clear;
	SL.Add(DateToStr(Date));
	For I ;= Low(A) To High(A) Do
	  SL.Add(Format(%s=%d,[A[i].Name,A[i].QT]);
	SL.Add('');  // adding empty string at the end of list
	SL.SaveToFile(AFileName);
  Finally
    SetLength(A,0); // clear heap
    SL.Free;
  End;
end;

PS. Не проверял, могут быть маленькие очепяточки и косячки. Ну и входные данные не проверяются.
Ответить с цитированием
Этот пользователь сказал Спасибо lmikle за это полезное сообщение:
val-tal (22.11.2018)
  #4  
Старый 22.11.2018, 17:48
val-tal val-tal вне форума
Прохожий
 
Регистрация: 21.11.2018
Сообщения: 3
Версия Delphi: Delphi7
Репутация: 10
По умолчанию

Не знаю уместно ли здесь выложить свой код, рискну.Прошу сильно ногами не пинать, не кодил уж лет цать, все забыл напрочь. В коментах в коде описал свой затык, помогите разобраться, ткните носом в ошибки
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
List_prod: TStrings;
i,i_f:Integer;
kol_f,s_text,str,str_f,str2,str_kol:string;

begin
  List_prod :=TStringList.Create;
  for i:=0 to Memo1.Lines.Count-1 do
    begin
      str:=Copy(Memo1.Lines.Strings[i], 1, Pos(' ' ,Memo1.Lines.Strings[i])-1); //до  разделителя
      str2:=Copy(Memo1.Lines.Strings[i], Pos(' ',Memo1.Lines.Strings[i])+1,Length(Memo1.Lines.Strings[i])); //после разделителя
      Delete(str2, Pos('=',str2),MaxInt);
      str_kol:=Copy(str2, Pos('*',str2)+1,Length(str2));
    ////////

    List_prod.LoadFromFile('prodano.txt');
    for i_f := 0 to List_prod.Count - 1 do
     begin
      s_text:=Copy(List_prod.Strings[i_f], 1, Pos('=' ,List_prod.Strings[i_f])-1);
      str_f:=Copy(s_text, 1, Pos('=' ,s_text)-1);
      kol_f:=Copy(List_prod.Strings[i_f], Pos('=',List_prod.Strings[i_f])+1,Length(List_prod.Strings[i_f]));
 // вот здесь if проверка не правильная, не знаю как реализовать поиск слова целиком, а так ищет любую букву
 // допустим str= булка, условие выполнистся если даже если str=улк
     if (Pos(str, List_prod.Strings[i_f]) > 0)  then
//    если в условии еще пытаюсь проверить длину str_f и str то нифига не работает-ошибка
//if (Pos(str, List_prod.Strings[i_f]) > 0)  and (Length(str_f)=Length(str)) then     
        begin
         //showmessage('слово найдено в файле');
         List_prod.Delete(i_f);
         List_prod.Insert(i_f, s_text+'='+FloatToStr(StrToFloat(str_kol)+StrToFloat(kol_f)));
         //сохраняем лист в файл и выходим из цикла
         List_prod.SaveToFile('prodano.txt');
        Break;
     end;
        //Если слово не найдено в файле
     if Pos(str, List_prod.Strings[i_f]) = 0 then
        begin
          //showmessage('слова нет');
          List_prod.Add(str+'='+str_kol);
          List_prod.SaveToFile('prodano.txt');
          Break;
        end;
        List_prod.Free;
    /////////


    end;


 end;
 end;
end.
Ответить с цитированием
  #5  
Старый 23.11.2018, 19:54
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,057
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

А в дебаггере встать на if и посмотреть значения переменных религия не позволяет?
Не совсем понял, что этот код делает. Вроде все тоже свмое, что и я тебе написал, только перелопачивает файл на каждую строчку мемо, что не есть гут. Чем тебя временный массив не устроил??? Ну и что-то еще ты в задании не досказал (судя по дополнительным обрезаниям строк в твоем коде).
Ответить с цитированием
  #6  
Старый 24.11.2018, 11:10
val-tal val-tal вне форума
Прохожий
 
Регистрация: 21.11.2018
Сообщения: 3
Версия Delphi: Delphi7
Репутация: 10
По умолчанию

Цитата:
Сообщение от lmikle
А в дебаггере встать на if и посмотреть значения переменных религия не позволяет?
Не совсем понял, что этот код делает. Вроде все тоже свмое, что и я тебе написал, только перелопачивает файл на каждую строчку мемо, что не есть гут. Чем тебя временный массив не устроил??? Ну и что-то еще ты в задании не досказал (судя по дополнительным обрезаниям строк в твоем коде).
В Мемо бывает максимум 10-15 строк, в файле до 50 не больше, массив получается вроде как из пушки по воробьям, как бы смысла и нет . Спасибо большое. Уже разобрался, все работает как надо.
Ответить с цитированием
  #7  
Старый 24.11.2018, 20:50
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,057
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Во первых, до 50 строк - фигня.
Во вторых, как раз и имеет смысл закешировать данные файла, что бы не перелопачивать его каждый раз.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 13:39.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter