How to parse TAB delimited text files (Views: 30)
Problem/Question/Abstract: How would I go about parsing TAB delimited text files? I'm having difficulty with the chr(9) character. Answer: Solve 1: { ... } var t: Textfile; line: string; elements: TStringlist; begin Assignfile(t, filename); Reset(t); try elements := TStringlist.Create; try while not Eof(t) do begin ReadLn(t, line); {The following ignores empty lines} if IScan(#9, line, 1) > 0 then begin elements.clear; SplitString(line, #9, elements); ProcessElements(elements); {you write this} end; end; finally elements.Free end; finally Closefile(t); end; {Return the position of the first instance of ch in S after position fromPos, or 0 if ch was not found} function IScan(ch: Char; const S: string; fromPos: Integer): Integer; var i: Integer; begin Result := 0; for i := fromPos to Length(S) do begin if S[i] = ch then begin Result := i; Break; end; end; end; {Split the passed string into substrings at the position of the separator character and add the substrings to the passed list. The list is not cleared first!} procedure SplitString(const S: string; separator: Char; substrings: TStrings); var i, n: Integer; begin if Assigned(substrings) and (Length(S) > 0) then begin i := 1; repeat n := IScan(separator, S, i); if n = 0 then n := Length(S) + 1; substrings.Add(Copy(S, i, n - i)); i := n + 1; until i > Length(S); end; end; Solve 2: procedure DelimitedListToStringList(const S: AnsiString; Delimiter: Char; List: TStrings; NullValue: AnsiString); var iPos: Integer; Temp, Temp1: AnsiString; begin if not Assigned(List) then Exit; List.Clear; Temp := S; iPos := Pos(Delimiter, S); while iPos > 0 do begin SetLength(Temp1, iPos - 1); Temp1 := Copy(Temp, 1, iPos - 1); if Temp1 = '' then begin SetLength(Temp1, Length(NullValue)); Temp1 := NullValue; end; List.Add(Temp1); Delete(Temp, 1, iPos); iPos := Pos(Delimiter, Temp); end; if Temp > '' then List.Add(Temp); end; |