Autor |
Beitrag |
tenacer
Hält's aus hier
Beiträge: 7
|
Verfasst: Sa 17.10.09 13:46
Hallo,
Ein Datensatz (.txt) habe ich in ein Memo geladen. In jeder Zeile stehen Daten nach dem Muster:
Name, Wert1,Wert2
Wie kann ich nun die Daten zerlegen und jeweils Name Wert1 oder Wert2 in Arrays speichern?
Bin über jede Hilfe dankbar
|
|
Andreas L.
      
Beiträge: 1703
Erhaltene Danke: 25
Windows Vista / Windows 10
Delphi 2009 Pro (JVCL, DragDrop, rmKlever, ICS, EmbeddedWB, DEC, Indy)
|
Verfasst: Sa 17.10.09 13:55
Entweder du zerlegst den String mit Pos, PosEx, Copy und Delete oder du verwendest einen CSV-Parser wie z. B. MyLittleBase oder meinen:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161: 162: 163: 164: 165: 166: 167: 168: 169: 170: 171: 172: 173: 174: 175: 176: 177: 178: 179: 180: 181: 182: 183: 184: 185: 186: 187: 188: 189: 190: 191:
| unit BCParsers;
interface
uses SysUtils, Classes, ContNrs, BCUtils, DateUtils, StrUtils;
type TBcCSVParser = class; TBcSimpleDataSets = class; TBcSimpleDataSet = class;
TBcCSVParser = class(TComponent) private FDataSets: TBcSimpleDataSets; FFieldSeparator: String; protected procedure SetDataSets(Value: TBcSimpleDataSets); public constructor Create(AOwner: TComponent); override; destructor Destroy; override; procedure ParseStrings(Strings: TStrings); procedure LoadFromStream(Stream: TStream); procedure LoadFromFile(const FileName: String); procedure BuildStrings(Strings: TStrings); procedure SaveToStream(Stream: TStream); procedure SaveToFile(const FileName: String); property DataSets: TBcSimpleDataSets read FDataSets write SetDataSets; published property FieldSeparator: String read FFieldSeparator write FFieldSeparator; end;
TBcSimpleDataSets = class(TObjectList) protected procedure SetItem(Index: Integer; Value: TBcSimpleDataSet); function GetItem(Index: Integer):TBcSimpleDataSet; public function Add:Integer; property Items[Index: Integer]: TBcSimpleDataSet read GetItem write SetItem; default; end;
TBcSimpleDataSet = class(TPersistent) private FFields: TStrings; protected procedure SetFields(Value: TStrings); public constructor Create; destructor Destroy; override; property Fields: TStrings read FFields write SetFields; end;
implementation
constructor TBcCSVParser.Create(AOwner: TComponent); begin inherited Create(AOwner); FDataSets := TBcSimpleDataSets.Create; FFieldSeparator := ';'; end;
destructor TBcCSVParser.Destroy; begin FDataSets.Free; inherited Destroy; end;
procedure TBcCSVParser.SetDataSets(Value: TBcSimpleDataSets); begin FDataSets := Value; end;
procedure TBcCSVParser.ParseStrings(Strings: TStrings); var iLine: Integer; CurrentLine: String; begin DataSets.Clear;
for iLine := 0 to Strings.Count -1 do begin CurrentLine := Trim(Strings[iLine]); if (pos('#', CurrentLine) = 0) and (CurrentLine <> '') then DataSets[DataSets.Add].Fields.Text := StringReplace(CurrentLine, FFieldSeparator, sLineBreak, [rfReplaceAll]); end; end;
procedure TBcCSVParser.LoadFromStream(Stream: TStream); var Data: TStrings; begin Data := TStringList.Create; try Data.LoadFromStream(Stream); ParseStrings(Data); finally Data.Free; end; end;
procedure TBcCSVParser.LoadFromFile(const FileName: string); var Data: TStrings; begin Data := TStringList.Create; try Data.LoadFromFile(FileName); ParseStrings(Data); finally Data.Free; end; end;
procedure TBcCSVParser.BuildStrings(Strings: TStrings); var iDataSet: Integer; begin Strings.Clear;
for iDataSet := 0 to DataSets.Count -1 do Strings.Add(StringReplace(DataSets[iDataSet].Fields.Text, sLineBreak, FFieldSeparator, [rfReplaceAll])); end;
procedure TBcCSVParser.SaveToStream(Stream: TStream); var Data: TStrings; begin Data := TStringList.Create; try BuildStrings(Data); Data.SaveToStream(Stream); finally Data.Free; end; end;
procedure TBcCSVParser.SaveToFile(const FileName: string); var Data: TStrings; begin Data := TStringList.Create; try BuildStrings(Data); Data.SaveToFile(FileName); finally Data.Free; end; end;
procedure TBcSimpleDataSets.SetItem(Index: Integer; Value: TBcSimpleDataSet); begin inherited Items[Index] := Value; end;
function TBcSimpleDataSets.GetItem(Index: Integer):TBcSimpleDataSet; begin Result := inherited Items[Index] as TBcSimpleDataSet; end;
function TBcSimpleDataSets.Add:Integer; var NewDataSet: TBcSimpleDataSet; begin NewDataSet := TBcSimpleDataSet.Create; Result := inherited Add(NewDataSet); end;
constructor TBcSimpleDataSet.Create; begin inherited Create; FFields := TStringList.Create; end;
destructor TBcSimpleDataSet.Destroy; begin FFields.Free; inherited Destroy; end;
procedure TBcSimpleDataSet.SetFields(Value: TStrings); begin FFields.Assign(Value); end; |
Anwendungsbeispiel:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| var csv: TBcCSVParser; i: Integer; begin csv := TBcCSVParser.Create(nil); try csv.ParseStrings(Memo1.Lines); for i := 0 to csv.DataSets.Count -1 do ShowMessage(CSV.DataSets[i].Fields.Text); finally csv.Free; end; end; |
|
|
tenacer 
Hält's aus hier
Beiträge: 7
|
Verfasst: Sa 17.10.09 15:42
Danke für die Nachricht, aber CSV-Parser sagen mir gar nichts.
Mit Pos habe ich es versucht aber ich versteh überhaupt nicht, wie ich alle Zeilen aus dem Memo aufteilen kann und dann die Daten in die jeweiligen Arrays kopieren kann. 
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: So 18.10.09 01:54
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: So 18.10.09 02:44
Nun ja, man kann auch mit Mücken auf Elefanten schießen. Ein einfaches Explode sollte schon reichen.
|
|
|