Грузим исходный шаблон в TStringList. Файл замен грузим еще в один TStringList. Далее идем по файлу и начинаем заменять строчки с помощью функции StringReplace. Далее просто сохраняем получившийся результат.
Для удобства я бы сохранял получившиеся файлы в одной папке, но с разными именами. А файл значений селал бы в формате INI. Тогда строчки можно использовать стандартые классы для разбора.
Примерно так:
Код:
program RepFile;
{$APPTYPE CONSOLE}
uses
SysUtils, Classes, IniFiles;
function ReplaceInText(ATemplate : String; AValues : TStringList) : String;
var
I : Integer;
begin
Result := ATemplate;
For I := 0 To AValues.Count-1 Do
Result := StringReplace(Result,AValues.Names[i],AValues.ValueFromIndex[i],[rfReplaceAll]);
end;
procedure ReplaceInFiles(AInFile, AValuesFile, AOutFolder : String);
var
I : Integer;
ASections, ATemplate, ANew, AValues : TStringList;
F : TIniFile;
ANewFileName : String;
begin
ASections := TStringList.Create;
ATemplate := TStringList.Create;
ANew := TStringList.Create;
AValues := TStringList.Create;
F := TIniFile.Create(AValuesFile);
Try
ATemplate.LoadFromFile(AInFile);
F.ReadSections(ASections);
For I := 0 To ASections.Count-1 Do
Begin
WriteLn('Processing section ' + ASections[i]);
AValues.Clear;
F.ReadSection(ASections[i],AValues);
ANew.Text := ReplaceInText(ATemplate.Text,AValues);
ANewFileName := IncludeTrailingPathDelimiter(AOutfolder) +
ChangeFileExt(ExtractFileName(AInFile),
'.'+ASections[i]+ExtractFileExt(AInFile));
ANew.SaveToFile(ANewFileName);
End;
WriteLn('Done');
Finally
F.Free;
ASections.Free;
ATemplate.Free;
ANew.Free;
End;
end;
procedure Help;
begin
WriteLn('Usage:');
WriteLn(' RepFile TemplateFileName ValuesFileName OutFolderName');
end;
begin
WriteLn('RepFile');
WriteLn;
If ParamCount <> 3
Then Help
Else ReplaceInFiles(ParamStr(1),ParamStr(2),ParamStr(3));
end.
Файл значений выглядит примерно так:
Код:
[value_set_1]
xxx=значение для xxx
yyy=значение для yyy
[value_set_2]
xxx=значение для xxx
yyy=значение для yyy
zzz=значение для zzz
[value_set_3]
xxx=значение для xxx
zzz=значение для zzz
Соотв. сгенерится 3 файла.