Wrote this for you, hope it helps:
Simba Code:
program CSVSnippet;
type TCSVObject = record
Header: TStringArray;
Items: Array of TStringArray;
end;
const Delimeter = ';';
LF = #10;
function CSVParse(Data: String; WithHeaders: Boolean): TCSVObject;
var ExplodedData, ExplodedSubData, HeaderData: TStringArray;
I, J, K: Integer;
begin
ExplodedData := Explode(LF, Data);
if (WithHeaders) then begin
HeaderData := Explode(Delimeter, ExplodedData[0]);
for I := 0 to High(HeaderData) do begin
HeaderData[I] := Replace(HeaderData[I], '"', '', [rfReplaceAll]);
end;
Result.Header := HeaderData;
K := 1;
end else begin
K := 0;
end;
SetLength(Result.Items, High(ExplodedData));
for I := K to High(ExplodedData) do begin
ExplodedSubData := Explode(Delimeter, ExplodedData[I]);
for J := 0 to High(ExplodedSubData) do begin
ExplodedSubData[J] := Replace(ExplodedSubData[J], '"', '', [rfReplaceAll]);
end;
Result.Items[I - 1] := ExplodedSubData;
end;
end;
function CSVGetHeaderIndex(CSVObject: TCSVObject; Needle: String): Integer;
var I: Integer;
begin
for I := 0 to High(CSVObject.Header) do begin
if (CSVObject.Header[I] = Needle) then begin
Result := I;
Exit;
end;
end;
end;
function CSVFind(CSVObject: TCSVObject; Needle: String): Integer;
var I, J: Integer;
begin
for I := 0 to High(CSVObject.Items) do begin
for J := 0 to High(CSVObject.Items[I]) do begin
if (CSVObject.Items[I][J] = Needle) then
Result := I;
Exit;
end;
end;
end;
function CSVGet(CSVObject: TCSVObject; Header: String): TStringArray;
var I, Index: Integer;
begin
Index := CSVGetHeaderIndex(CSVObject, Header);
SetLength(Result, High(CSVObject.Items) + 1);
for I := 0 to High(CSVObject.Items) do begin
Result[I] := CSVObject.Items[I][Index];
end;
end;
var HTTPClient: Integer;
Data: String;
CSVObject: TCSVObject;
begin
// Initialize our HTTP client.
HTTPClient := InitializeHTTPClient(False);
// Get the CSV file as string.
Data := GetHTTPPage(HTTPClient, 'http://static.frement.net/srl/example.csv');
// Pass the retrieved CSV data to our function.
// (Note: the example has headers, so WithHeaders has to be True,
// else it will treat headers as actual item)
CSVObject := CSVParse(Data, True);
// Output the whole object.
Writeln(ToStr(CSVObject));
// Find a specific item with any value in the item. (Note: will return the first found)
Writeln(ToStr(CSVObject.Items[CSVFind(CSVObject, '00001')]));
// Get all values from the object by header.
Writeln(ToStr(CSVGet(CSVObject, 'Addresse')));
// Free our HTTP client.
FreeHTTPClient(HTTPClient);
end.