GELÖST : Textfile in Memo laden und die Zeile Wort für Wort auslesen

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Bernie110
Beiträge: 140
Registriert: Mo 10. Feb 2020, 17:43

GELÖST : Textfile in Memo laden und die Zeile Wort für Wort auslesen

Beitrag von Bernie110 »

Hallo Zusammen,

ich habe 700 Zeilen in einer Textdatei. Grundlegend handelt es sich um Artikeldaten.
Die Textdatei ist so aufgebaut
Beispiel
ID Artikel Nr Barcode Artikeltext
-----------------------------------------
105185 11670478 Ì11670478JÎ ABU/V2A/355
105186 11670479 Ì11670479RÎ ABU/V2A/400
105187 11670480 Ì11670480xÎ ABU/V2A/450
105188 11670481 Ì11670481ÄÎ ABU/V2A/500
105189 11670482 Ì11670482!Î ABU/V2A/560
105190 11670483 Ì11670483)Î ABU/V2A/600
105191 11670484 Ì116704841Î ABU/V2A/630
105192 11670485 Ì116704859Î ABU/V2A/710
105193 11670486 Ì11670486AÎ ABU/V2A/800
105194 11670487 Ì11670487IÎ ABU/V2A/900
505966 10000013 Ì10000013~Î ABU/280
505967 10000014 Ì10000014ÊÎ ABU/300
505968 10000015 Ì10000015'Î ABU/315
505969 10000016 Ì10000016/Î ABU/355
505970 10000017 Ì100000177Î ABU/400
505971 10000018 Ì10000018?Î ABU/450
505972 10000019 Ì10000019GÎ ABU/500

Ich möchte nun in einem Editfeld die ID eingeben und die Zeile finden.

Beispiel : Ich gebe die NR 105191 ein
Dann soll das Suchergebnis das hier finden :
ID Artikel Nr Barcode Artikeltext
-----------------------------------------
105191 11670484 Ì116704841Î ABU/V2A/630

Danach soll er mir die Daten in weiteren 3 Editfeldern anzeigen.

Edit2.text := 11670484
Edit3.text := Ì116704841Î
Edit4.text := ABU/V2A/630

Wie macht man so etwas geschmeidig ?

Vielen Dank im voraus fürs lesen und eventueller Hilfe
Lg Bernie
Zuletzt geändert von Bernie110 am Fr 19. Jul 2024, 11:40, insgesamt 1-mal geändert.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6848
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Textfile in Memo laden und die Zeile Wort für Wort auslesen

Beitrag von af0815 »

Viele Wege führen nach Rom. Bei 700 Zeilen kann man das direkt in ein Stringgrid einlesen, wenn man die Trennen richtig setzt und das ganze konsistent ist.

Ansonsten das ganze in eine Stringlist einlesen und dann Zeile für Zeile in eine Struktur deiner Wahl einfügen.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
photor
Beiträge: 523
Registriert: Mo 24. Jan 2011, 21:38
OS, Lazarus, FPC: Arch Linux: L 3.2 (Gtk2) FPC 3.2.2
CPU-Target: 64Bit

Re: Textfile in Memo laden und die Zeile Wort für Wort auslesen

Beitrag von photor »

af0815 hat geschrieben: Do 18. Jul 2024, 19:43 Ansonsten das ganze in eine Stringlist einlesen und dann Zeile für Zeile in eine Struktur deiner Wahl einfügen.
z.B. jede Zeile (aus der File-StringList) wieder in eine Zeilen-StringList (

Code: Alles auswählen

Zeile := File[i];
) einlesen und einen entsprechendes Trennzeichen (z.B. Space, Tab, ...) festlegen. Dann liegen die Einträge getrennt in den Feldern der Zeilen-Stringlist vor (

Code: Alles auswählen

Blah := Zeile[0]; Blub := Zeile[1], ...
). Eventuell kann man die dann noch weiter unterteilen (z.B. letzter Eintrag: ABU/V2A/355)

Ciao,
Photor

Bernie110
Beiträge: 140
Registriert: Mo 10. Feb 2020, 17:43

Re: Textfile in Memo laden und die Zeile Wort für Wort auslesen

Beitrag von Bernie110 »

Oje ich habs mir fast gedacht. Stringlist.
Null Plan was ich da machen muss. ( Verstehe natürlich was damit gemeint ist )
Hab auch schon mal gesucht wie man ne CSV Datei in eine Stringlist bekommt. Aber null Plan wie man das dann auslesen muss.

CSV würde so aussehen :
---------------------------------------------------------------------------------------
| ID | ArtikelN | BARCODE | Artikel_Text |
---------------------------------------------------------------------------------------
| 105182 | 11670475 | Ì116704752Î | ABU/V2A/280 |
---------------------------------------------------------------------------------------
| 105183 | 11670476 | Ì11670476:Î | ABU/V2A/300 |
---------------------------------------------------------------------------------------
| 105184 | 11670477 | Ì11670477BÎ | ABU/V2A/315 |
---------------------------------------------------------------------------------------
| 105185 | 11670478 | Ì11670478JÎ | ABU/V2A/355 |
---------------------------------------------------------------------------------------
| 105186 | 11670479 | Ì11670479RÎ | ABU/V2A/400 |
---------------------------------------------------------------------------------------
| 105187 | 11670480 | Ì11670480xÎ | ABU/V2A/450 |
---------------------------------------------------------------------------------------
| 105188 | 11670481 | Ì11670481ÄÎ | ABU/V2A/500 |
---------------------------------------------------------------------------------------
| 105189 | 11670482 | Ì11670482!Î | ABU/V2A/560 |
---------------------------------------------------------------------------------------
| 105190 | 11670483 | Ì11670483)Î | ABU/V2A/600 |
---------------------------------------------------------------------------------------
| 105191 | 11670484 | Ì116704841Î | ABU/V2A/630 |
---------------------------------------------------------------------------------------
| 105192 | 11670485 | Ì116704859Î | ABU/V2A/710 |
---------------------------------------------------------------------------------------
| 105193 | 11670486 | Ì11670486AÎ | ABU/V2A/800 |
---------------------------------------------------------------------------------------
| 105194 | 11670487 | Ì11670487IÎ | ABU/V2A/900 |
---------------------------------------------------------------------------------------
| 505966 | 10000013 | Ì10000013~Î | ABU/280 |
---------------------------------------------------------------------------------------


Die Daten bekomme ich dann wohl so in die Sting list oder ?

Code: Alles auswählen

var sl: TStringList;
i: integer;
Zeile : String;
begin
  FilePath.text := 'C:\Users\bernh\OneDrive\Desktop\Barcodes\DATEN.txt';


  sl:=TStringList.Create;

  try
    sl.LoadFromFile(FilePath.text);
    sl.Delimiter:='|';
    for i:=0 to sl.Count-1 do begin
     // und hier sollte wohl etwas passieren 
    end;
  finally
    sl.free;
  end;
Wie bekomme ich die Linien ------------------------------- weg ?

Und wie sucht man dann in der Stringliste mittels : EDIT1.text Feld := '105194 ';
Und wie liesst den Rest der Zeile aus ?

1000 Fragen.. sorry..

Ich finde im Netz nicht mal nen Ansatz der mich da in die richtige Richtung schubbsen würde.
:(

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6848
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Textfile in Memo laden und die Zeile Wort für Wort auslesen

Beitrag von af0815 »

sl.strictdelimiter oder so ähnlich gehört noch dazu. Und die Delimitereinstellungen mache ich immer vor dem Laden.

Es gibt auch die Eigenschaft delimitedtext. Damit kann man dann Zeile für Zeile nochmals mit einer weiteren Stringlist zerlegen.

Daher mit der ersten Stringlist zerlegt man in einzelne Zeilen und mit der zweiten Stringlist die Zeilen in die Felder. Die gewonnenen Teile muss man sich in ein Array, Liste oder DB abspeichern.

Wie gesagt, schlau gemacht, kann das ein Stringgrid normalerweise auch und dort sieht man gleich alles.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
theo
Beiträge: 10922
Registriert: Mo 11. Sep 2006, 19:01

Re: Textfile in Memo laden und die Zeile Wort für Wort auslesen

Beitrag von theo »

Warum nicht einfach csvdocument nehmen, wenn es schon da ist?

Code: Alles auswählen

uses
..., csvdocument;
       
...

procedure TForm1.Button1Click(Sender: TObject);
var
  CSVDoc: TCSVDocument;
  Idx: integer;
begin
  CSVDoc := TCSVDocument.Create;
  try
    CSVDoc.Delimiter := ' ';
    CSVDoc.LoadFromFile('testb.csv');
    Idx := CSVDoc.IndexOfRow('105191', 0);
    if idx >= 0 then
    begin
      Edit1.Text := CSVDoc.Cells[1, Idx];
      Edit2.Text := CSVDoc.Cells[2, Idx];
    end;
  finally
    CSVDoc.Free;
  end;
end;   

wp_xyz
Beiträge: 5191
Registriert: Fr 8. Apr 2011, 09:01

Re: Textfile in Memo laden und die Zeile Wort für Wort auslesen

Beitrag von wp_xyz »

Auch wenn theo's Lösung an Einfachheit nicht zu überbieten ist, will ich die Lösung mit Hilfe einer Stringliste skizzieren (programmieren musst du es aber selber):
Bernie110 hat geschrieben: Do 18. Jul 2024, 21:21 CSV würde so aussehen :
---------------------------------------------------------------------------------------
| ID | ArtikelN | BARCODE | Artikel_Text |
---------------------------------------------------------------------------------------
| 105182 | 11670475 | Ì116704752Î | ABU/V2A/280 |
---------------------------------------------------------------------------------------
| 105183 | 11670476 | Ì11670476:Î | ABU/V2A/300 |
---------------------------------------------------------------------------------------
| 105184 | 11670477 | Ì11670477BÎ | ABU/V2A/315 |
...
Warum denn so kompliziert? Deine Ausgangsdaten im ersten Post sind doch schon CSV, nur darf man das "C" in "CSV" ("comma-separated values") nicht so genau nehmen. Denn du hast zwischen den einzelnen Elementen immer ein Leerzeichen, das nirgendwo sonst vorkommt und das du somit als Feld-Trenner verwenden kannst.

Also: Nimm eine Stringlist, nenne sie z.B. "Zeilen" und lies die ganze Datei ein ("Zeilen.LoadFromFile(dateiname)"). Die Stringlist enthält dann für jede Dateizeile einen Eintrag, den du über einen Index ansprechen kannst.

Jede Zeile enthält aber die Felder "ID", "Artikel Nr", "Barcode" und "Artikel Text", hintereinander und jeweils durch ein Leerzeichen getrennt. Du könntest nun eine zweite StringList nehmen ("Felder"), für die du die Eigenschaft Delimiter auf "(Leerzeichen)" setzt und der du die Zeile als "Felder.DelimitedText := Zeilen[ i ]" zuweist. Dadurch wird der Zeilenstring an den Leerzeichen in die einzelnen Wörter (Felder) aufgetrennt. Diese kannst du wieder über einen Index ansprechen. Oder - etwas einfacher, und das würde ich empfehlen - du nimmst die String-Helper-Funktion ".Split(trenner)", die genau dasselbe macht, nur stehen jetzt die Felder in einem dynamischen Array, das du nicht extra wieder freigeben must. (wobei "trenner" ein Leerzeichen ist).

Um eine eingegebene ID zu finden, erzeugst du also die StringList "Zeilen", liest die Datei ein und durchläufst die StringList Zeile für Zeile ("for i := 2 to Zeilen.Count-1..."). Achtung: Ich beginne die Schleife beim Wert 2, um die beiden ersten Zeilen (Feldnamen und Trennlinie) auszublenden. In der Schleife rufst du für jede Zeile den ".Split" Helper auf und schreibst dessen Resultat in ein "TStringArray" (oder "array of string") namens "Felder" ("Felder := Zeilen[ i].Split(' ')"). Die ID steht im ersten Element von "Felder", und du musst "Felder[0]" nur mit dem Suchstring vergleichen. Bei Übereinstimmung kannst du die anderen Felder in die Edit-Controls schreiben.

Zum Schluss nicht vergessen, die StringList "Zeilen" wieder aufzuräumen ("Zeilen.Free").

Benutzeravatar
h-elsner
Lazarusforum e. V.
Beiträge: 282
Registriert: Di 24. Jul 2012, 15:42
OS, Lazarus, FPC: LINUX Mint21.1, Win10, Lazarus 2.2.4, FPC3.2.2
CPU-Target: X86-64; arm 32bit
Wohnort: Illertissen
Kontaktdaten:

Re: Textfile in Memo laden und die Zeile Wort für Wort auslesen

Beitrag von h-elsner »

Ein Minimalprojekt als Vorschlag, offen zur Erweiterung. Hilfetexte, Icons und so fehlen noch...
StringList.zip
(3.64 KiB) 92-mal heruntergeladen

Bernie110
Beiträge: 140
Registriert: Mo 10. Feb 2020, 17:43

Re: Textfile in Memo laden und die Zeile Wort für Wort auslesen

Beitrag von Bernie110 »

theo hat geschrieben: Do 18. Jul 2024, 22:48 Warum nicht einfach csvdocument nehmen, wenn es schon da ist?
Hi Theo vielen Dank!

Das wäre genau das was ich suche.
csvdocument ist mir tatsächlich bei meiner GoogleSuche nicht begegnet.

Es gibt nur ein Problem. Er verschluckt mir diese Sonderzeichen vom Bacrcode: Ì und Î Barcode-String Beispiel Ì11670481ÄÎ
Er fügt am Anfang sogar ein ? an.
Der String sieht beim auslesen nun so aus : ?11670481Ä

Bin das Problem jetzt so angegangen dass ich im String nach einem oder mehreren Fragezeichen Suche und dann eines und zwar das am Anfang lösche :

Code: Alles auswählen

   s := Barcode.Text;
   Pos1 := Pos('?', s);
   if Pos1 <> 0 then
   begin
     Pos2 := PosEx('?', s, Pos1 + 1);
     if Pos2 <> 0 then
       ShowMessage('gefunden an Position: '  + IntToStr(Pos2))
     else
       Delete(s, 1, 1);
       Barcode.Text := 'Ì' + s + 'Î';
     end
     else
     begin
       Barcode.Text := 'Ì' + Barcode.Text+ 'Î';
     end;  
Muss man das tatäschlich auf diese Art machen ?
Lg Bernie


Ps : Danke für alle anderen Antworten. Euer Gedankenanstösse helfen mir sehr !!

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6848
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Textfile in Memo laden und die Zeile Wort für Wort auslesen

Beitrag von af0815 »

Bernie110 hat geschrieben: Fr 19. Jul 2024, 08:14 Es gibt nur ein Problem. Er verschluckt mir diese Sonderzeichen vom Bacrcode: Ì und Î Barcode-String Beispiel Ì11670481ÄÎ
Er fügt am Anfang sogar ein ? an.
Willkommen in den Niederungen der Zeichenkodierung :-)

Bei diesen Sachen fängt das ganze Problem an. In welcher Zeichenkodierung sind die Daten, in welcher Zeichenkodierung brauchst du sie im Programm. Beispiel WIndows verwendet gerne Windows-1252 (cp1252) oder ISO 8859-1 (teilweise UTF-16 intern = widestring), Lazarus selbst verwendet gerne UTF-8. Um das ganze unter einen Hut zu bringen wird es meistens tricky.

Kennst du die Ausgangskodierung, so kann man versuchen diese in die von Lazarus verwendete Kodierung zu ändern. Eventuell mit https://lazarus-ccr.sourceforge.io/docs ... oding.html ConvertEncoding das encoding ändern.

Hinweis: Falls due NotePad++ verwendest, so kann der dir rechts unten einen Hinweis geben, wie die Daten vermutlich kodiert sind.

@Theo: Danke für den Hinweis auf TCSVDocument, das kannte ich nicht - wieder was gelernt.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Bernie110
Beiträge: 140
Registriert: Mo 10. Feb 2020, 17:43

Re: Textfile in Memo laden und die Zeile Wort für Wort auslesen

Beitrag von Bernie110 »

Hi KLASSE !!! jetzt hab ich es genau so wie es laufen soll.
VIELEN VIELEN DANK @all !!!!!!!!

Benutzeravatar
theo
Beiträge: 10922
Registriert: Mo 11. Sep 2006, 19:01

Re: Textfile in Memo laden und die Zeile Wort für Wort auslesen

Beitrag von theo »

Bernie110 hat geschrieben: Fr 19. Jul 2024, 11:38 Hi KLASSE !!! jetzt hab ich es genau so wie es laufen soll.
VIELEN VIELEN DANK @all !!!!!!!!
Und wie hast du es jetzt gelöst?
Hast du die Ausgangsdatei umcodiert oder machst du das in deinem Programm "on-the-fly"?

Bernie110
Beiträge: 140
Registriert: Mo 10. Feb 2020, 17:43

Re: GELÖST : Textfile in Memo laden und die Zeile Wort für Wort auslesen

Beitrag von Bernie110 »

theo hat geschrieben: Fr 19. Jul 2024, 13:11 Und wie hast du es jetzt gelöst?
Hast du die Ausgangsdatei umcodiert oder machst du das in deinem Programm "on-the-fly"?
Hi ich habs umcodiert.
Soweit passt das auch.
Danke nochmals
Lg Bernie

wp_xyz
Beiträge: 5191
Registriert: Fr 8. Apr 2011, 09:01

Re: GELÖST : Textfile in Memo laden und die Zeile Wort für Wort auslesen

Beitrag von wp_xyz »

Welcher Barcode-Type ist das eigentlich? Mit dem LazBarcodes-Package könntest du den Barcode direkt auf dem Formular anzeigen, die UTF-8 Zeichen am Anfang und Ende des Barcode-Feldes, wegen denen du die ganze Datei umkodieren musstest, werden vom Barcode-Generator erzeugt und sind eigentlich unnötig.

Das könnte dann z.B. so aussehen wie im angehängten Screenshot. (Hier ist angenommen, dass es sich um einen der 2-aus-5-Codes handelt - kannst du evtl mit deinen Smartphone prüfen).
Dateianhänge
barcode-artikelnr.png
barcode-artikelnr.png (9.11 KiB) 1212 mal betrachtet

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6848
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: GELÖST : Textfile in Memo laden und die Zeile Wort für Wort auslesen

Beitrag von af0815 »

Im Industriebereich hast du den Barcode meist in der DB oder den Dateien, die werden oft von der Barcodereadern zur Verfügung gestellt. deswegen ist die Anzeige der Barcode meist nicht notwendig. Und Drucken tut man die meistens mit speziellen Druckern (Sato, CAB, Zebra,...) die sind halt für das Ausgelegt und werden oft von den Anlagen oder Verwaltungssystemen direkt angesteuert.

Meistens hat man Probleme mit Inventurlisten, wo die Barcodes ganz einfach Roh eingetragen sind, da können schon mal spezielle Zeichen als Trenner verwendet sein. Ach ja die Automotive-Industrie hat dafür auch spezielle Standards entwickelt :-) Ich kann davon mittlerweile ein Lied singen. Aktuell wird immer mehr auf RFID + Barcode gebracht. Da kann man ein ganzes Auto in einen speziellen Tunnel schieben und alle Teile melden sich per RFID und dann kann man prüfen ob alle Teile vorhanden sind und richtig verbaut wurden. Ja jeder sch.. Teil hat dann einen RFID mit einer genauen Kennung :-)
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Antworten