![]() |
Delphi-Version: 6
Stringlist und pad String
Hallo!
Ich möchte eine Tabulator getrennte Datei, bestehend aus mehreren Datensätzen, in eine Datei mit fixer Zeilenlänge überführen. Beispiel: Datensatzschema
Code:
Ziel ist:
AAAAA [Tab] BBBBBxBBBBBBxBBBBB [Zeilenende]
A ist der String vor dem Tabulator [Tab] soll das Trennzeichen darstellen B soll den kompletten String nach dem Trennzeichen darstellen x stellt das Leerzeichen(Space) dar welches mit zum String B gehört Zeilenende markiert das Datensatzende
Code:
mit folgendem Code aus der DP
AAAAA.....BBBBBxBBBBBBxBBBBB...............[Zeilenende]
wobei ... nur zur verdeutlichung der einzufügenden Leerzeichen stehen
Delphi-Quellcode:
habe ich leider folgendes schematisches Ergebnis.
function PadR(aValue: string; aLen: byte; aFill: char): string;
//right pads a string with spaces begin Result := aValue + StringOfChar(aFill, aLen - Length(aValue)); end; procedure TForm1.Button1Click(Sender: TObject); var sl1: TStringList; sl2: TStringList; ndx1: integer; feld001: string; feld002: string; begin sl1 := TStringList.Create; sl2 := TStringList.Create; try sl2.Delimiter := #9; sl1.LoadFromFile('kurz.txt'); for ndx1 := 0 to Pred(sl1.Count) do begin sl2.DelimitedText := sl1.Strings[ndx1]; feld001 := PadR(sl2.Strings[0], 20, ' '); feld002 := PadR(sl2.Strings[1], 50, ' '); Memo1.Lines.add(feld001 + feld002); end; finally sl2.Free; sl1.Free; end; end;
Code:
Offenbar schneidet Stringlist.string den gesamten String B an der Stelle des ersten Leerzeichens ab und überschreibt den Rest des Strings mit Leerzeichen.
AAAAA.....BBBBB.................................
Wie kann ich das Verhindern ? |
AW: Stringlist und pad String
Delphi-Quellcode:
[edit] Oh, Delphi 6, da gab es das IIRC noch nicht. Klappt es vielleicht hiermit?
sl2.StrictDelimiter := true;
Delphi-Quellcode:
[/edit]
procedure SplitString(const Src: string; Delimiter: char;
DestList: TStrings); var PLast, PCurrent: PChar; s: string; begin Assert(Assigned(DestList)); DestList.BeginUpdate; try DestList.Clear; PLast := PChar(Src); PCurrent := PChar(Src); while PCurrent^ <> #0 do begin if PCurrent^ = Delimiter then begin SetString(s, PLast, PCurrent - PLast); DestList.Add(s); PLast := CharNext(PCurrent); end; PCurrent := CharNext(PCurrent); end; SetString(s, PLast, PCurrent - PLast); DestList.Add(s); finally DestList.EndUpdate; end; end; |
AW: Stringlist und pad String
Zitat:
|
AW: Stringlist und pad String
3 Spalten, mit 10, 30 und 20 Zeichen. (ohne großartige Fehlerprüfung)
Delphi-Quellcode:
var
TheFile, TheLine: TStringList; i: Integer; begin TheFile := TStringList.Create; try TheFile.LoadFromFile('TheFile.csv'); TheLine := TStringList.Create; try for i := 0 to TheFile.Count - 1 do begin TheLine.Text := StringReplace(TheFile[i], #9, sLineBreak, [rfReplaceAll]); TheFile[i] := Format('%.10s%.30s%.20s', [TheLine[0], TheLine[1], TheLine[2]]); end; finally TheLine.Free; end; TheFile.LoadFromFile('TheFile.dat'); finally TheFile.Free; end; |
AW: Stringlist und pad String
Meine Prozedur ist nur als Ersatz für das Trennen mit Delimiter/DelimitedText gedacht, also statt der Zeile
Zitat:
Delphi-Quellcode:
aufrufen, Rest wie gehabt.
SplitString(sl1[ndx1], #9, sl2);
|
AW: Stringlist und pad String
Mein Dank an Himitsu.
Delphi-Quellcode:
Nach längerem Hin und Her habe ich den Quelltext von Himitsu auf mein Problem angepaßt. Dennoch habe ich noch ein paar Fragen:
procedure TForm1.Button4Click(Sender: TObject);
var TheFile, TheLine: TStringList; i: Integer; begin TheFile := TStringList.Create; try TheFile.LoadFromFile('kurz.txt'); TheLine := TStringList.Create; try for i := 0 to TheFile.Count - 1 do begin TheLine.Text := StringReplace(TheFile[i], #9, sLineBreak, [rfReplaceAll]); // TheFile[i] := Format('%.100s', [TheLine[0]]) + Format('%.100s',[TheLine[1]]); TheFile[i] := TheLine[0] + StringOfChar ( ' ', 30 - Length(TheLine[0]) ) + TheLine[1] + StringOfChar ( ' ', 100 - Length(TheLine[1]) ); end; finally TheLine.Free; end; TheFile.SaveToFile('TheFile.txt'); finally TheFile.Free; end; end; 1. bei meiner Recherche zum Thema hab ich festgestellt, daß die eingefügte Zeile
Code:
der Formatangabe entspricht. Wieso funktioniert die Ausführung der FormatZeile bei mir nicht, sie kompiliert aber es kommt bloß Blödsinn raus.
TheFile[i] := TheLine[0] + StringOfChar ( ' ', 30 - Length(TheLine[0]) ) + TheLine[1] + StringOfChar ( ' ', 100 - Length(TheLine[1]) );
2. Bei stringreplace wird sLineBreak verwendet. Was heißt das? Ich hätte #13#10 verwendet, was ja völlig falsch wäre. sLineBreak wird in der Delphihilfe auch nicht gefunden. Gibt es vielleicht noch weitere derartige Befehle die man kennen sollte. Danke |
AW: Stringlist und pad String
zu
1) Wie sieht denn der "Blödsinn" aus? 2) sLinebreak ist eine Variable, die je nach Betriebssystem die Kodierung für ein Zeilenende enthält. Solange Du Dich nur auf einem Windows(desktop) bewegst ist das das gleiche wie #13#10 Es ist nicht eigentlich falsch #13#10 zu verwenden, sondern es schränkt dich auf ein System ein. Mit sLinebreak mußt Du Dir da eine Sorge weniger machen. Gruß K-H |
AW: Stringlist und pad String
Zitat:
Code:
das heißt: Line[0] hatte 5 Ausgangszeichen und wurde mit 95 Leerzeichen aufgefüllt, während Line[1] direkt an die 5 Zeichen von Line[0] angehängt wurden ohne sichtbare Trennung oder Auffüllung durch Leerzeichen.
AAAAABBBBB {+ weitere 90 Leerzeichen}
|
AW: Stringlist und pad String
Seltsam
Delphi-Quellcode:
Das funktioniert wie gewünscht!
var
A,B,C : string; begin A:='AAAAAAA'; B:='BBBBBB'; C:='CCCCC'; memo1.Lines.Add(format('%-99s %-99s %-99s ',[A,B,C])); end; Gruß K-H |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:44 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz