![]() |
Dateien in einer Stringliste oder TMemo importieren?
Wie kann man solchen Dateien in einer Stringliste oder TMemo formatiert importieren?
Delphi-Quellcode:
Das ganze sollte dann so aussehen.
2210030000002;Truthahnwurst;1,49
2210031000001;Cordon Bleu;4,29 2210032000000;Gyros;3,99 2210033000009;Gewürze;0,89
Delphi-Quellcode:
Hat Einer von Euch schon mal so was gemacht?
2210030000002 Truthahnwurst 1,49
2210031000001 Cordon Bleu 4,29 2210032000000 Gyros 3,99 2210033000009 Gewürze 0,89 |
Re: Dateien in einer Stringliste oder TMemo importieren?
vllt klappts ja wenn du die semikoli mitnem tabulatorchar ersetzt und dann in nen memo paxt
|
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. |
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.
|
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. |
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?
|
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 ;) |
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 |
Re: Dateien in einer Stringliste oder TMemo importieren?
@malo "Insert()" wäre dein Freund zum "Einfügen"
|
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!
|
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?
|
Re: Dateien in einer Stringliste oder TMemo importieren?
Zitat:
|
Re: Dateien in einer Stringliste oder TMemo importieren?
Zitat:
Man kann bei einem Memo ja auch einfach die TabStops (in Pixeln) setzen:
Delphi-Quellcode:
[Edit]
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; Hier noch ein Beispiel wie man das ganze parsen könnte:
Delphi-Quellcode:
Es wird jede Zeile der Textdatei durchlaufen (SL1) dann wird jeder "Teil" (mit dem Trennzeichen ";") als eine Zeile in SL2 bereitgestellt.
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; |
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; |
Re: Dateien in einer Stringliste oder TMemo importieren?
Zitat:
Zeile 1, Stelle 0 bis 13 = Nummer, Stelle 14 bis 24 = Bezeichnung, Stelle 25 bis 32 = Preis. Das ganze, Zeile für Zeile. |
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:
Edit: Fehler im Code beseitigt
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; |
Re: Dateien in einer Stringliste oder TMemo importieren?
Zitat:
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 |
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 |
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. |
Re: Dateien in einer Stringliste oder TMemo importieren?
Zitat:
Delphi-Quellcode:
@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.
function PadR(aValue: string; aLen: byte; aFill: char): string;
//right pads a string with spaces begin Result := aValue + StringOfChar(aFill, aLen - Length(aValue)); end; |
Re: Dateien in einer Stringliste oder TMemo importieren?
Zitat:
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. |
Re: Dateien in einer Stringliste oder TMemo importieren?
Zitat:
Schon fast richtig.
Delphi-Quellcode:
Sollte so sein.
2210178000001 Paprika 1,69
2210179000000 Fettarmer Joghurt 0,59 2210177000002 Tomatenmark 0,89
Delphi-Quellcode:
Trozdem, danke für Deine Mühe.
2210178000001 Paprika 1,69
2210179000000 Fettarmer Joghurt 0,59 2210177000002 Tomatenmark 0,89 |
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. :???: |
Re: Dateien in einer Stringliste oder TMemo importieren?
Hallo Heike,
Zitat:
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