Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Dateien in einer Stringliste oder TMemo importieren? (https://www.delphipraxis.net/50526-dateien-einer-stringliste-oder-tmemo-importieren.html)

smart 27. Jul 2005 08:19


Dateien in einer Stringliste oder TMemo importieren?
 
Wie kann man solchen Dateien in einer Stringliste oder TMemo formatiert importieren?
Delphi-Quellcode:
2210030000002;Truthahnwurst;1,49
2210031000001;Cordon Bleu;4,29
2210032000000;Gyros;3,99
2210033000009;Gewürze;0,89
Das ganze sollte dann so aussehen.
Delphi-Quellcode:
2210030000002    Truthahnwurst  1,49
2210031000001    Cordon Bleu    4,29
2210032000000    Gyros          3,99
2210033000009    Gewürze        0,89
Hat Einer von Euch schon mal so was gemacht?

barf00s 27. Jul 2005 08:22

Re: Dateien in einer Stringliste oder TMemo importieren?
 
vllt klappts ja wenn du die semikoli mitnem tabulatorchar ersetzt und dann in nen memo paxt

Thanatos81 27. Jul 2005 08:23

Re: Dateien in einer Stringliste oder TMemo importieren?
 
Schau dir mal bei der TStringList Delimiter und DelimitedText an, das dürfte dir weiterhelfen.

Ansonsten hab ich irgendwo noch Code rumliegen, um CSV-Text in ein StringGrid zu importieren. Der dürfte mit einigen kleineren Anpassungen auch für deine Anforderung geeignet sein.

smart 27. Jul 2005 08:26

Re: Dateien in einer Stringliste oder TMemo importieren?
 
Ich habe schon versucht mit StringReplace ein Tabulatorchar zu setzen klappt auch, aber damit bekomme ich keine feste Breite hin.

Thanatos81 27. Jul 2005 08:30

Re: Dateien in einer Stringliste oder TMemo importieren?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hab das Projekt wieder gefunden, vllt. hilfts dir ja weiter

€dit:
Die Prozeduren ReadCSVFile und WriteCSVFile kommen im Original irgendwo ausm Netz, ich hab die auch lediglich an meine Zwecke angepasst.

barf00s 27. Jul 2005 08:30

Re: Dateien in einer Stringliste oder TMemo importieren?
 
das du das ganze inner TListView organisierst - würde für dich nicht in frage kommen, oder?

malo 27. Jul 2005 08:32

Re: Dateien in einer Stringliste oder TMemo importieren?
 
Du könntest ja prüfen, ob das Semikolon an einer bestimmten Stelle ist (Pos) und wenn nicht, ein Leerzeichen davorsetzen. Und das solange, bis es an der richtigen Stelle steht (danach löschen).

Ich würde dir jetzt einen Beispielcode schreiben, aber ich weiß grad nicht, wie man ein Zeichen "da zwischen" einfügen kann und hab kein Delphi zum probieren da ;)

marabu 27. Jul 2005 08:45

Re: Dateien in einer Stringliste oder TMemo importieren?
 
Hallo Heike,

nur für die Anzeige kannst du ein Memo verwenden, wenn du einen fixed width font einstellst und die Spaltenwerte links oder rechts mit Leerstellen auffüllst. Dabei fehlt dir dann eine Spaltenüberschrift. Also lieber gleich mit einem StringGrid.

Grüße vom marabu

barf00s 27. Jul 2005 08:47

Re: Dateien in einer Stringliste oder TMemo importieren?
 
@malo "Insert()" wäre dein Freund zum "Einfügen"

smart 27. Jul 2005 12:51

Re: Dateien in einer Stringliste oder TMemo importieren?
 
Vielen Dank schonmal für Eure Antworten. Ich komme aber nicht wirklich weiter. Bei der Ausgabe in einem TMemo bekomme ich einfach die feste Breite nicht hin!

Thanatos81 27. Jul 2005 13:00

Re: Dateien in einer Stringliste oder TMemo importieren?
 
So lange du keine Schriftart benutzt, bei der alle Zeichen exakt die gleich Breite haben, wirst du das auch nicht hinbekommen. Muss es denn zwangsweise ein Memo sein?

smart 27. Jul 2005 13:04

Re: Dateien in einer Stringliste oder TMemo importieren?
 
Zitat:

Zitat von Thanatos81
So lange du keine Schriftart benutzt, bei der alle Zeichen exakt die gleich Breite haben, wirst du das auch nicht hinbekommen. Muss es denn zwangsweise ein Memo sein?

Nein, Es kann auch eine Stringliste sein, nur das Format muss stimmen da es vom einem fremden Programm so verarbeitet wird.

Sharky 27. Jul 2005 13:06

Re: Dateien in einer Stringliste oder TMemo importieren?
 
Zitat:

Zitat von Thanatos81
So lange du keine Schriftart benutzt, bei der alle Zeichen exakt die gleich Breite haben, wirst du das auch nicht hinbekommen.

Auch wenn ein StrigGrid oder TreeView auf jeden fall besser ist.
Man kann bei einem Memo ja auch einfach die TabStops (in Pixeln) setzen:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var
  ndx : integer;
  TabArray : Array [0..4] of integer;
begin
  Memo1.WantTabs := True;
  for ndx := 0 to 4 do
  begin
   TabArray[ndx] := 30 * ndx;
  end;
  SendMessage(Memo1.Handle,EM_SETTABSTOPS,5,LongInt(@TabArray));
end;
[Edit]
Hier noch ein Beispiel wie man das ganze parsen könnte:
Delphi-Quellcode:
procedure TForm1.LadenClick(Sender: TObject);
var
  sl1: TStringList;
  sl2: TStringList;
  ndx1: integer;
  ndx2: integer;
begin
  sl1 := TStringList.Create;
  sl2 := TStringList.Create;
  try
    sl2.Delimiter := ';';
    sl1.LoadFromFile(Dateiname);
    for ndx1 := 0 to Pred (sl1.Count) do
    begin
      sl2.DelimitedText := sl1.Strings[ndx1];
      for ndx2 := 0 to Pred(sl2.Count) do
      begin
        MacheEtwasMitJederZeile (sl2.Strings[ndx2]);
      end;
    end;
  finally
    sl2.Free;
    sl1.Free;
  end;
end;
Es wird jede Zeile der Textdatei durchlaufen (SL1) dann wird jeder "Teil" (mit dem Trennzeichen ";") als eine Zeile in SL2 bereitgestellt.

Thanatos81 27. Jul 2005 13:24

Re: Dateien in einer Stringliste oder TMemo importieren?
 
OK, wie Sharky bewiesen hat, hätte ich schreiben sollen "wirst du das auch nicht schön hinbekommen." :wink:

Hab ich das richtig? Du liest Dateien ein, die mit ; getrennt sind und musst die so aufbereiten, dass sie statt dessen mit Tab getrennt sind, damit ein drittes Programm das verarbeiten kann?

Dann würde ich auf visuelle Kompos verzichten, und einfach nur ';' durch Tab ersetzen und dann das ganze wieder wegspeichern.

€dit, also ungefähr so:
Delphi-Quellcode:
procedure ersetze(input,output: TFileName);
var sl : TStringList;
begin
  sl := TStringList.Create;
  try
    sl.LoadFromFile(input);
    sl.Text := StringReplace(sl.Text,';',#9,[rfReplaceAll]);
    sl.SaveToFile(output);
  finally
    FreeAndNil(sl);
  end;
end;

smart 27. Jul 2005 14:02

Re: Dateien in einer Stringliste oder TMemo importieren?
 
Zitat:

Zitat von Thanatos81
OK, wie Sharky bewiesen hat, hätte ich schreiben sollen "wirst du das auch nicht schön hinbekommen." :wink:

Hab ich das richtig? Du liest Dateien ein, die mit ; getrennt sind und musst die so aufbereiten, dass sie statt dessen mit Tab getrennt sind, damit ein drittes Programm das verarbeiten kann?

Dann würde ich auf visuelle Kompos verzichten, und einfach nur ';' durch Tab ersetzen und dann das ganze wieder wegspeichern.

€dit, also ungefähr so:
Delphi-Quellcode:
procedure ersetze(input,output: TFileName);
var sl : TStringList;
begin
  sl := TStringList.Create;
  try
    sl.LoadFromFile(input);
    sl.Text := StringReplace(sl.Text,';',#9,[rfReplaceAll]);
    sl.SaveToFile(output);
  finally
    FreeAndNil(sl);
  end;
end;

Auf die Idee bin ich auch schon bekommen, aber dann habe ich kein Format. Das Format sieht so aus:
Zeile 1, Stelle 0 bis 13 = Nummer, Stelle 14 bis 24 = Bezeichnung, Stelle 25 bis 32 = Preis. Das ganze, Zeile für Zeile.

Sharky 27. Jul 2005 14:12

Re: Dateien in einer Stringliste oder TMemo importieren?
 
Hai Heike,

das "formatieren" dürfte kein Problem sein;-)

Hier mal eine veränderte Form meines obigen Codes:
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.LadenClick(Sender: TObject);
var
  sl1:   TStringList;
  sl2:   TStringList;
  ndx1:  integer;
  nummer: string;
  preis: string;
  bezeichung: string;
begin
  sl1 := TStringList.Create;
  sl2 := TStringList.Create;
  try
    sl2.Delimiter := ';';
    sl1.LoadFromFile(Dateiname);
    for ndx1 := 0 to Pred(sl1.Count) do
    begin
      sl2.DelimitedText := sl1.Strings[ndx1];
      nummer     := PadR(sl2.Strings[0], 13, ' ');
      bezeichnung := PadR(sl2.Strings[1], 10, ' ');
      Memo1.Lines.add(nummer + bezeichnung + preis);
    end;
  finally
    sl2.Free;
    sl1.Free;
  end;
end;
Edit: Fehler im Code beseitigt

smart 27. Jul 2005 14:20

Re: Dateien in einer Stringliste oder TMemo importieren?
 
Zitat:

Zitat von Sharky
Hai Heike,

das "formatieren" dürfte kein Problem sein;-)

Hier mal eine veränderte Form meines obigen Codes:

Hallo Stepahn!

Vielen Dank für Deine Mühe. Da bekomme ich Fehlermeldungen:
Delphi-Quellcode:
[Fehler] Unit1.pas(32): Undefinierter Bezeichner: 'aValue'
[Fehler] Unit1.pas(32): Undefinierter Bezeichner: 'aLen'
[Fehler] Unit1.pas(32): Inkompatible Typen
[Fehler] Unit1.pas(38): Anweisung erwartet, aber 'VAR' gefunden
[Fehler] Unit1.pas(54): Undefinierter Bezeichner: 'PadR'
[Fehler] Unit1.pas(56): Operator oder Semikolon fehlt
[Fehler] Unit1.pas(63): '.' erwartet, aber ';' gefunden
[Hinweis] Unit1.pas(17): Das private-Symbol 'PadR' wurde deklariert, aber nie verwendet
[Fataler Fehler] Project2.dpr(5): Verwendete Unit 'Unit1.pas' kann nicht compiliert werden

marabu 27. Jul 2005 14:32

Re: Dateien in einer Stringliste oder TMemo importieren?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Das von Heike beschriebene Eingabeformat lässt sich aufgrund einer Design-Schwäche in der Komponente TStringList nicht über DelimitedText verarbeiten. Leerzeichen werden als Delimiter behandelt - ich hatte schonmal darauf hingewiesen...

Grüße vom marabu

ste_ett 27. Jul 2005 14:57

Re: Dateien in einer Stringliste oder TMemo importieren?
 
Warum arbeitest du nicht mit einem Tabulator(#9)? :gruebel:

Pro 8 Zeichen nimmst du einen Tabulator für Zeilen, die kürzer sind.

Nimm einfach den String bei den ';' auseinander und prüfe für alle Zeilen einmal die Länge.
Anhand des längsten Strings setzt du dann die Gesamtlänge für die "Spalte" fest.
Bei zu kurzen Strings mit Tabulator auffüllen.

Sharky 27. Jul 2005 15:00

Re: Dateien in einer Stringliste oder TMemo importieren?
 
Zitat:

Zitat von smart
...Vielen Dank für Deine Mühe. Da bekomme ich Fehlermeldungen:

Ups... da habe ich mich beim tippen der Funktion vertippelt ;-)

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;
@marabu: Mist. Das Blank in dem einen Text habe ich übersehen. Ich dachte es wäre keine da. Dann würde es nämlich gehen.

smart 27. Jul 2005 15:12

Re: Dateien in einer Stringliste oder TMemo importieren?
 
Zitat:

Zitat von Sharky
Zitat:

Zitat von smart
...Vielen Dank für Deine Mühe. Da bekomme ich Fehlermeldungen:

Ups... da habe ich mich beim tippen der Funktion vertippelt ;-)

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;

Hallo nochmal!

Jetzt bekomme ich diese Fehler:
[Fehler] Unit1.pas(50): Nicht genügend wirkliche Parameter
[Fehler] Unit1.pas(51): Nicht genügend wirkliche Parameter
[Fataler Fehler] Project1.dpr(5): Verwendete Unit 'Unit1.pas' kann nicht compiliert werden

Heike.

smart 27. Jul 2005 15:19

Re: Dateien in einer Stringliste oder TMemo importieren?
 
Zitat:

Zitat von marabu
Das von Heike beschriebene Eingabeformat lässt sich aufgrund einer Design-Schwäche in der Komponente TStringList nicht über DelimitedText verarbeiten. Leerzeichen werden als Delimiter behandelt - ich hatte schonmal darauf hingewiesen...

Grüße vom marabu

Hallo marabu!

Schon fast richtig.
Delphi-Quellcode:
2210178000001   Paprika   1,69
2210179000000   Fettarmer Joghurt   0,59
2210177000002   Tomatenmark 0,89
Sollte so sein.
Delphi-Quellcode:
2210178000001   Paprika            1,69
2210179000000   Fettarmer Joghurt   0,59
2210177000002   Tomatenmark   0,89
Trozdem, danke für Deine Mühe.

bigg 27. Jul 2005 15:53

Re: Dateien in einer Stringliste oder TMemo importieren?
 
Moin,

du benötigst in jedem Fall schonmal eine Blockschrift.
Die Gängiste wäre hier "Courier New".

Nun musst du alle Einträge durchgehen und den längsten Eintrag ermitteln.
(Den Längsten Eintrag der 1., der 2. und der 3 Reihe.)

Dannach füllst du alle Reihen mit Leerzeichen auf und fertig ist dein Memo. :???:

marabu 27. Jul 2005 15:59

Re: Dateien in einer Stringliste oder TMemo importieren?
 
Hallo Heike,

Zitat:

Schon fast richtig.
ich kann jetzt nicht erkennen, ob ein Fehler in meinem Code vorliegt oder in der Art, wie du ihn verwendest. Wenn du glaubst, dass ich irgendwo gepatzt habe, dann wäre es nett, wenn du den Fehler bezeichnest, damit ich ihn verbessern kann. Der Code ist sehr allgemein gehalten und es könnte noch jemand außer dir auf die Idee kommen ihn zu verwenden...

marabu


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:00 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