![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
задача такая, среда 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
|
|||
|
|||
|
Обычный TStringList или простой самописный массив решат твою задачу.
Алгоритм примерно такой (кстати, собственно тут тебе нужен map/hashmap): 1. Читаем файл, разбираем все строки и запоминаем (в TStringList или в массиве, как удобнее) пары имя=значение. 2. Так же разбираем строки из Memo, только всесто запоминания добавляем в существующие или новые. 3. Сохраняем из массива все обратно в файл с простановкой новой даты. |
|
#3
|
|||
|
|||
|
Аот весь код для твоей задачи:
Код:
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
|
|||
|
|||
|
Не знаю уместно ли здесь выложить свой код, рискну.Прошу сильно ногами не пинать, не кодил уж лет цать, все забыл напрочь. В коментах в коде описал свой затык, помогите разобраться, ткните носом в ошибки
Код:
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
|
|||
|
|||
|
А в дебаггере встать на if и посмотреть значения переменных религия не позволяет?
Не совсем понял, что этот код делает. Вроде все тоже свмое, что и я тебе написал, только перелопачивает файл на каждую строчку мемо, что не есть гут. Чем тебя временный массив не устроил??? Ну и что-то еще ты в задании не досказал (судя по дополнительным обрезаниям строк в твоем коде). |
|
#6
|
|||
|
|||
|
Цитата:
|
|
#7
|
|||
|
|||
|
Во первых, до 50 строк - фигня.
Во вторых, как раз и имеет смысл закешировать данные файла, что бы не перелопачивать его каждый раз. |