Wie kann ich Datensätze separieren?

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Lisa20

Wie kann ich Datensätze separieren?

Beitrag von Lisa20 »

Hallo ich bin neu hier und somit auch nicht so gut im programmieren.
Mein Problem ist, ich habe einen Datensatz der so hier geöffnet wird in einer Listbox :

datum+'#'+anzahl+'#'+artikel+'#'+preis+'#'+geschaeft+'#'+summe

Diesen Datensatz möchte ich separiert in anderen Listboxen ausgeben :

datum in lbxdatum
anzahl in lbxanzahl
artikel in lbxartikel
preis in lbxpreis
geschaeft in lbxgeschaeft
und summe in lbxsumme

In der Schule hatten wir schon ein Beispiel, aber da hatten wir nur als Beispiel den Vorname,Nachname und das Geburtsdatum zum separieren. Das heißt die ersten 3 Dinge(Datum,Artikel,Anzahl) bekomme ich separiert. Mein Problem ist, dass ich das nicht ganz verstehe und nicht umsetzen kann für die weiteren Positionen.

Code: Alles auswählen

procedure TForm3.btnsortierenClick(Sender: TObject);
var
  laenge,anz_zeile,i,j,pos1,pos2:integer;
  zeichen,datum,artikel,anzahl,zeile:string;
begin
  anz_zeile:=lbxgekauft.count;
  for i:=0 to anz_zeile-1 do begin
    laenge:=length(lbxgekauft.items[i]);
    zeile:=lbxgekauft.items[i];
    pos1:=0;
    pos2:=0;
    for j:=1 to laenge do begin
      zeichen:=copy(zeile,j,1);
      if zeichen='#' then begin
        if (pos2=0) and (pos1=0) then
      pos1:=j;
        if (pos2=0) and (j>pos1) then
      pos2:=j;
      end;
    end;
   datum:=copy(zeile,1,pos1-1);
   artikel:=copy(zeile,pos1+1,pos2-pos1-1);
   anzahl:=copy(zeile,pos2+1,laenge-pos2);    
lbxdatum.items.add(datum);
lbxartikel.items.add(artikel);
lbxanzahl.items.add(anzahl); 
Kann mir jemand helfen wie ich das ganze umschreiben muss, wenn ich 5 Positionen('#') habe?
Würde mich über jede Hilfe freuen! :)
Zuletzt geändert von Lori am Mi 8. Apr 2015, 20:38, insgesamt 1-mal geändert.
Grund: Bitte den Highlighter nutzen.

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

Re: Wie kann ich Datensätze separieren?

Beitrag von wp_xyz »

Es gibt dafür viele Lösungen. Diejenige, die deinem Ansatz am nächsten kommt, würde ich in die folgenden Schritte zerlegen. Versuche, das zu verstehen, und beantworte auch die eingestreuten Fragen:
  • Verwende ein Array von Integern. Für jedes #-Zeichen wird ein Array-Element reserviert. Wie muss das Array deklariert sein?
  • Durchlaufe den String, bis du das 1. #-Zeichen findest. Schreibe den Index des Zeichens in das 1. Array-Element.
  • Suche weiter, bis du das 2. #-Zeichen findest. Schreibe diese Position in das 2. Array-Element.
  • usw. bis der String zu Ende ist.
  • Den Teilstring bis zum 1. #-Zeichen erhältst du durch "copy" vom 1. Stringzeichen bis zur Position vor dem Inhalt des 1. Array-Elements. Wie lauten dafür die Parameter für den copy-Befehl?
  • Der zweite Teilstring beginnt nach dem Stringindex, der im 1. Array-Element gespeichert ist, und endet vor dem Stringindex, der im 2. Array-Element steht. Welche Parameter müssen in den copy-Befehl?
  • Entsprechend mit den anderen Teilstrings, bis auf den letzten, denn dessen Ende hat keinen entsprechenden Eintrag in dem Array mehr, sondern ist identisch mit dem String-Ende. Aber diesen Fall hast du in deinem Code ja schon behandelt (wie übrigens auch die anderen).
Ein Tipp noch: "zeichen := copy(zeile, j, 1)" ist eine umständliche Variante von "zeichen := zeile[j]".

Und noch ein Tipp: Wenn du in dem Posting deinen Programm-Code mit "[ code=laz]" und "[ /code]" (jeweils ohne das Leerzeichen nach der öffnenden Klammer) einschließst, wird das Syntaxhighlighting aktiviert, und wir tun uns leichter, deinen Code zu lesen.

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: Wie kann ich Datensätze separieren?

Beitrag von Michl »

Es gibt dafür sehr viele unterschiedliche Herangehensweisen. Ich persönlich mag ExtractWord.

Man kann das auch mit Pos(...), Copy(...) etc. lösen. Das sollst du dir doch dann aber bestimmt selber überlegen?!

Edit: Sowas, einmal nach der Dokumentation geschaut und wp war schneller...

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6781
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: Wie kann ich Datensätze separieren?

Beitrag von af0815 »

StringList nehmen (siehe Wiki)

http://wiki.freepascal.org/TStringList- ... utorial/de
http://wiki.freepascal.org/Stringlist/de

Code: Alles auswählen

      TS.Delimiter:='#';
      TS.QuoteChar:='"';
 
Edit: Zusatzinfo -> Schau dir mal die Eigenschafts Items der Listbox an
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Lisa20

Re: Wie kann ich Datensätze separieren?

Beitrag von Lisa20 »

Ich danke euch für eure Antworten, aber ich bin zurzeit etwas überfordert.

Trotzdem vielen Dank. :wink:

Lisa20

Re: Wie kann ich Datensätze separieren?

Beitrag von Lisa20 »

Also im Falle jemand hat ein ähnliches Problem, ich habe das Problem so lösen können :

Code: Alles auswählen

 
procedure TForm3.btnseparierenClick(Sender: TObject);
var
  laenge,anz_zeile,i,j,pos1,pos2,pos3,pos4,pos5:integer;
  zeile,zeichen,datum,anzahl,artikel,preis,geschaeft,summe:string;
begin
    anz_zeile:=lbxgesamt.count;
  for i:=0 to anz_zeile-1 do begin
    laenge:=length(lbxgesamt.items[i]);
    zeile:=lbxgesamt.items[i];
    pos1:=0;
    pos2:=0;
    pos3:=0;
    pos4:=0;
    pos5:=0;
    for j:=1 to laenge do begin
      zeichen:=copy(zeile,j,1);
      if zeichen='#' then begin
        if (pos2=0) and (pos1=0) then
      pos1:=j;
             if (pos2=0) and (j>pos1) then
      pos2:=j;
              if (pos3=0) and (j>pos1) and (j>pos2) then
      pos3:=j;
               if (pos4=0) and (j>pos1) and (j>pos2) and (j>pos3) then
      pos4:=j;
              if (pos5=0) and(j>pos1) and (j>pos2) and (j>pos3)and (j>pos4) then
     pos5:=j;
      end;
    end;
    datum:=copy(zeile,1,pos1-1);
    artikel:=copy(zeile,pos1+1,pos2-pos1-1);
    anzahl:=copy(zeile,pos2+1,pos3-pos2-1);
    preis:=copy(zeile,pos3+1,pos4-pos3-1);
    geschaeft:=copy(zeile,pos4+1,pos5-pos4-1);
    summe:=copy(zeile,pos5+1,laenge-pos5);
    lbxdatum.items.add(datum);
    lbxartikel.items.add(artikel);
    lbxanzahl.items.add(anzahl);
    lbxpreis.items.add(preis);
    lbxgeschaeft.items.add(geschaeft);
    lbxsumme.items.add(summe);
  end;
 
end;
 

hde
Beiträge: 556
Registriert: Mi 11. Aug 2010, 02:56

Re: Wie kann ich Datensätze separieren?

Beitrag von hde »

kaum macht man's richtig, schon funktioniert es :wink: ok, es gibt auch andere Wege aber hauptsächlich es läuft .. und selbst gemacht macht :D

Antworten