2013-04-03 57 views
3

我有很長的配置文件,我需要從文件中提取特定的字符串。 我想要提取/讀取的是InstallDir以獲得特定的號碼位置,例如對於20540.從Inno Setup的Pascal腳本配置文件中查找並讀取特定的字符串

我知道如何在INI或XML中查找字符串,但無法處理這種形式的文件。

的文件片段,顯示結構:

"212280" 
{ 
    "InstallDir"  "D:\\XYZ\\stu\\opr" 
    "UpdateKBtoDL"  "0" 
    "HasAllLocalContent"  "1" 
    "UpToDate"  "1" 
    "DisableAutoUpdate"  "0" 
} 
"20540" 
{ 
    "UpdateKBtoDL"  "0" 
    "InstallDir"  "C:\\ABC\\def\\ghi" 
    "HasAllLocalContent"  "1" 
    "UpToDate"  "1" 
    "maintenance_time"  "1339663134" 
    "DisableAutoUpdate"  "0" 
} 
"4560" 
{ 
    "UpdateKBtoDL"  "0" 
    "HasAllLocalContent"  "0" 
    "UpToDate"  "0" 
    "InstallDir"  "" 
} 
+0

沒有其他方法可以爲這個幾乎JSON類型的文件編寫自己的解析器。這是很多工作... – TLama

+0

對...生活不能簡單;-)我正在考慮像這樣的流程:查找數字位置(因爲它是唯一的),然後讀取{...}塊後編號並從塊中提取InstallDir字符串。 – RobeN

回答

5

你需要編寫自己的解析器。這可能是一種可能的實現方式:

[Code] 
function GetInstallDir(const FileName, Section: string): string; 
var 
    S: string; 
    DirLine: Integer; 
    LineCount: Integer; 
    SectionLine: Integer;  
    Lines: TArrayOfString; 
begin 
    Result := ''; 
    S := '"' + Section + '"'; // AddQuotes is broken somehow... 
    if LoadStringsFromFile(FileName, Lines) then 
    begin 
    LineCount := GetArrayLength(Lines); 
    for SectionLine := 0 to LineCount - 1 do 
     if Trim(Lines[SectionLine]) = S then 
     begin 
     if (SectionLine < LineCount) and (Trim(Lines[SectionLine + 1]) = '{') then 
      for DirLine := SectionLine to LineCount - 1 do 
      begin 
      if (Pos('"InstallDir"', Lines[DirLine]) > 0) and 
       (StringChangeEx(Lines[DirLine], '"InstallDir"', '', True) > 0) then 
      begin 
       S := RemoveQuotes(Trim(Lines[DirLine])); 
       StringChangeEx(S, '\\', '\', True); 
       Result := S; 
       Exit; 
      end; 
      if Trim(Lines[DirLine]) = '}' then 
       Exit; 
      end; 
     Exit; 
     end; 
    end; 
end; 

procedure InitializeWizard; 
begin       
    MsgBox(GetInstallDir('d:\File.almostjson', '20540'), mbInformation, MB_OK); 
end; 
相關問題