Вот очень простой код, который поможет вам в этом. Там нет проверки ошибок, и вы, несомненно, захотите разработать и изменить его дальше. Дело в том, что должны быть некоторые идеи, которые помогут вам написать код, который работает для вас.
Теперь, когда я разделил запятые полей, но не пытался обрабатывать появление запятых ни в одном из значений. Если это проблема, выберите другой разделитель или не используйте запятые. Я играл с написанием каждого поля в отдельной строке (эффективно используя новую строку в качестве разделителя), но это делает код чтения более сложным для написания.
Опять же, главное в том, что это не окончательный производственный код, но он предназначен для того, чтобы дать вам отправную точку.
function Split(const s: string; Separator: char): TStringDynArray;
var
i, ItemIndex: Integer;
len: Integer;
SeparatorCount: Integer;
Start: Integer;
begin
len := Length(s);
if len=0 then begin
Result := nil;
exit;
end;
SeparatorCount := 0;
for i := 1 to len do begin
if s[i]=Separator then begin
inc(SeparatorCount);
end;
end;
SetLength(Result, SeparatorCount+1);
ItemIndex := 0;
Start := 1;
for i := 1 to len do begin
if s[i]=Separator then begin
Result[ItemIndex] := Copy(s, Start, i-Start);
inc(ItemIndex);
Start := i+1;
end;
end;
Result[ItemIndex] := Copy(s, Start, len-Start+1);
end;
type
TValue = record
i1, i2: Integer;
s: string;
end;
TMyDict = class(TDictionary<string,TValue>)
public
procedure SaveToFile(const FileName: string);
procedure LoadFromFile(const FileName: string);
end;
{ TMyDict }
procedure TMyDict.SaveToFile(const FileName: string);
var
Strings: TStringList;
Item: TPair<string,TValue>;
begin
Strings := TStringList.Create;
Try
for Item in Self do begin
Strings.Add(Format(
'%s,%s,%d,%d',
[Item.Key, Item.Value.s, Item.Value.i1, Item.Value.i2]
));
end;
Strings.SaveToFile(FileName);
Finally
FreeAndNil(Strings);
End;
end;
procedure TMyDict.LoadFromFile(const FileName: string);
var
Strings: TStringList;
Item: TPair<string,TValue>;
Line: string;
Fields: TStringDynArray;
begin
Strings := TStringList.Create;
Try
Strings.LoadFromFile(FileName);
for Line in Strings do begin
Fields := Split(Line, ',');
Assert(Length(Fields)=4);
Item.Key := Fields[0];
Item.Value.s := Fields[1];
Item.Value.i1 := StrToInt(Fields[2]);
Item.Value.i2 := StrToInt(Fields[3]);
Add(Item.Key, Item.Value);
end;
Finally
FreeAndNil(Strings);
End;
end;
Обратите внимание, что вы не пытаетесь найти файл на диске. Вы просто загружаете его в память, в словарь и оттуда смотрите.
Словарь отлично подходит, когда вы всегда используете один и тот же ключ. Если у вас несколько ключей, то словарь менее удобен, но кого волнует влияние на производительность, если у вас всего 15 записей?!
Отказ от ответственности : я не запускал код, я не проверял его и т. Д. И т. Д.