AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Stringlist und pad String

Ein Thema von blutigerAnfänger · begonnen am 25. Feb 2014 · letzter Beitrag vom 27. Feb 2014
Antwort Antwort
blutigerAnfänger

Registriert seit: 23. Mär 2010
82 Beiträge
 
#1

Stringlist und pad String

  Alt 25. Feb 2014, 13:43
Delphi-Version: 6
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:
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
Ziel ist:
Code:
AAAAA.....BBBBBxBBBBBBxBBBBB...............[Zeilenende]

wobei ... nur zur verdeutlichung der einzufügenden Leerzeichen stehen
mit folgendem Code aus der DP

Delphi-Quellcode:
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;
habe ich leider folgendes schematisches Ergebnis.

Code:
AAAAA.....BBBBB.................................
Offenbar schneidet Stringlist.string den gesamten String B an der Stelle des ersten Leerzeichens ab und überschreibt den Rest des Strings mit Leerzeichen.

Wie kann ich das Verhindern ?
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.540 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Stringlist und pad String

  Alt 25. Feb 2014, 13:45
sl2.StrictDelimiter := true; [edit] Oh, Delphi 6, da gab es das IIRC noch nicht. Klappt es vielleicht hiermit?
Delphi-Quellcode:
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;
[/edit]
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen

Geändert von DeddyH (25. Feb 2014 um 13:49 Uhr)
  Mit Zitat antworten Zitat
blutigerAnfänger

Registriert seit: 23. Mär 2010
82 Beiträge
 
#3

AW: Stringlist und pad String

  Alt 25. Feb 2014, 19:20

[edit] Oh, Delphi 6, da gab es das IIRC noch nicht. Klappt es vielleicht hiermit?
leider nein. Deine Prozedur trennt ausschließlich am Trennzeichen beide Strings und stellt sie in verschiedenen Zeilen im memo dar.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.136 Beiträge
 
Delphi 12 Athens
 
#4

AW: Stringlist und pad String

  Alt 25. Feb 2014, 19:51
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;
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.540 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Stringlist und pad String

  Alt 25. Feb 2014, 20:55
Meine Prozedur ist nur als Ersatz für das Trennen mit Delimiter/DelimitedText gedacht, also statt der Zeile
Zitat:
sl2.DelimitedText := sl1.Strings[ndx1];
einfach
SplitString(sl1[ndx1], #9, sl2); aufrufen, Rest wie gehabt.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
blutigerAnfänger

Registriert seit: 23. Mär 2010
82 Beiträge
 
#6

AW: Stringlist und pad String

  Alt 26. Feb 2014, 16:45
Mein Dank an Himitsu.

Delphi-Quellcode:
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;
Nach längerem Hin und Her habe ich den Quelltext von Himitsu auf mein Problem angepaßt. Dennoch habe ich noch ein paar Fragen:
1. bei meiner Recherche zum Thema hab ich festgestellt, daß die eingefügte Zeile
Code:
        TheFile[i] := TheLine[0] + StringOfChar ( ' ', 30 - Length(TheLine[0]) ) + TheLine[1] + StringOfChar ( ' ', 100 - Length(TheLine[1]) );
der Formatangabe entspricht. Wieso funktioniert die Ausführung der FormatZeile bei mir nicht, sie kompiliert aber es kommt bloß Blödsinn raus.
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
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#7

AW: Stringlist und pad String

  Alt 26. Feb 2014, 17:01
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
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
blutigerAnfänger

Registriert seit: 23. Mär 2010
82 Beiträge
 
#8

AW: Stringlist und pad String

  Alt 26. Feb 2014, 17:35
zu
1) Wie sieht denn der "Blödsinn" aus?
na z.B. hab ich den Parameter für Line[0] auf 100 gesetzt, Ergebnis in Anlehnung an Beitrag 1
Code:
AAAAABBBBB {+ weitere 90 Leerzeichen}
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.
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#9

AW: Stringlist und pad String

  Alt 27. Feb 2014, 11:34
Seltsam
Delphi-Quellcode:
var
  A,B,C : string;
begin
  A:='AAAAAAA';
  B:='BBBBBB';
  C:='CCCCC';
  memo1.Lines.Add(format('%-99s %-99s %-99s ',[A,B,C]));
end;
Das funktioniert wie gewünscht!

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:33 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz