Stringlist-Daten verarbeiten

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
dash_develop
Beiträge: 38
Registriert: So 15. Mai 2016, 13:33

Stringlist-Daten verarbeiten

Beitrag von dash_develop »

Hallo zusammen,

ich bin gerade am Verzweifeln wie ich meine Daten in einer Stringlist richtig verarbeitet bekomme.

Meine Stringlist sieht wie folgt aus (Export aus Excel):

Code: Alles auswählen

 
;;;;
;;;;
Datum;Ueberschrift 1;Ueberschrift 2;Ueberschrift 3;Ueberschrift 4
;;;;
06.04.2017 12:00;Artk.1;;Sachnr.;0
06.04.2017 12:10;Artk.2;asdf;Text3;1265
06.04.2017 12:15;Artk.3;Sachnum/adsf;Textsdfs;61651
06.04.2017 12:15;Artk.4;;Texxxx;
;;;;
 


Mein Ziel ist es die Stringlist in eine Art EDI komformes Format (VDA4905) zu verwandlen... Dazu müsste ich die Daten so wie eine Art Serienbrief verarbeiten können.

Das heißt ich habe feste Werte in einer TXT Datei die ich mit den Feldern füllen muss.

Beipsiel wie meine .TXT Datei dann ausehen müsste:

Code: Alles auswählen

 
SATZART 511: 51101156196419849   498419 19 19 189 4 89494949 49 49 4 984   0
SATZART 512: 51201213<06.04.2017 12:00>      adsfasd <Artk.1>   d fasd
SATZART 513: 51301 4<>   <Sachnr.>           1964191asdfasdf                 
SATZART 514: 514046                      <0>                                              6516106
SATZART 512: 51201213<06.04.2017 12:10>      adsfasd <Artk.2>   d fasd
SATZART 513: 51301 4<asdf>   <Text3>           1964191asdfasdf                 
SATZART 514: 514046                      <1265>                                              6516106   
SATZART 512: 51201213<06.04.2017 12:20>      adsfasd <Artk.3>   d fasd
SATZART 513: 51301 4<Sachnum/adsf>   <Textsdfs>           1964191asdfasdf                 
SATZART 514: 514046                      <61651>                                              6516106
SATZART 512: 51201213<06.04.2017 12:30>      adsfasd <Artk.4>   d fasd
SATZART 513: 51301 4<>   <Texxxx>           1964191asdfasdf                 
SATZART 514: 514046                      <>                                              6516106               
SATZART 519: 5190200000010000004000000400000040000004000000000000000000000                                                                   
 

Bei der Satzart 519 müsste man die dick markierten Felder anhand der vorher verwendeten Felder errechnen..

Ist so ein Vorhaben, was ich probiere überhaupt für einen Anfänger möglich? Traut ihr sowas, einem Anfänger zu? Bin nämlich schon ziemlich am verzweifeln und bräuchte mal wieder paar Gedankenanstöße oder Links die mir weiterhelfen könnten.

Gruß
dash_develop

Mathias
Beiträge: 6164
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Stringlist-Daten verarbeiten

Beitrag von Mathias »

Ich denke, dein erster Schritt wird sein, die einzelnen Spalten in einzelne Strings zu zerlegen.
Das würde in etwa so aussehen:

Code: Alles auswählen

const
  s = '06.04.2017 12:10;Artk.2;asdf;Text3;1265;';
var
  sa: TStringArray;
  i: integer;
begin
  sa := s.Split(';');
  for i := 0 to Length(sa) - 1 do begin  // Test-Ausgabe
    WriteLn(sa[i]);
  end;


Deine Ausgabe kannst dann in etwa so zusammenstellen:

Code: Alles auswählen

  s := 'SATZART 513: 51031<' + sa[0] + '>   <' + sa[1] + '>';


Ich hoffe, das dies ein bisschen weiter hilft.

Was ich nicht weis, was solche Werte wie "d fasd" heissen.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

dash_develop
Beiträge: 38
Registriert: So 15. Mai 2016, 13:33

Re: Stringlist-Daten verarbeiten

Beitrag von dash_develop »

Hallo Mathias,

danke erstmal für deine rasche Rückmeldung.
Das hilft mir erstmal weiter.

Jedoch habe ich fragen zur Ausgabe:

Die Ausgabe ist ja davon abhängig wieviele Lieferabrufe ich habe..
Dementsprechend müsste er ja rein theoretisch errechnen wie oft Satzart 512 -514 benötigt werden und welches SA[i]da rein muss.
Ist das mit dem Stringlistarray auch realisierbar und ich muss bloß mehr denken und überlegen?
Oder habe ich mit dem Array keine Chance das so zu machen?

Kann man da iwie eine fortlaufende VAR aus dem SA[0] bis SA[ENDE] basteln das man immer das selbe im String einträgt und er sich das automatisch zieht?

Code: Alles auswählen

   ListBox1.Items.LoadFromFile(CSVFileName);
   s := ListBox1.Items.Text;
 
   sa := s.Split(';');
 
  for i := 0 to Length(sa) -1 do begin
    x := Length(sa)+1;
    ListBox2.Items.Add(sa[i+x]);
  end;


Bei sowas erhalte ich nämlich nur eine Fehlermeldung. :(


Code: Alles auswählen

Was ich nicht weis, was solche Werte wie "d fasd" heissen.

Das war nur sporadisch auf der Tastatur rumgedrückt. Die Echtdaten sehen komplett anders aus, sind bloß vom Aufbau gleich.


Gruß
dash_develop

dash_develop
Beiträge: 38
Registriert: So 15. Mai 2016, 13:33

Re: Stringlist-Daten verarbeiten

Beitrag von dash_develop »

Habe mir jetzt eine Art Zähler gebaut und probiere morgen in neuer Frische meine .TXT zu basteln, vielen Dank nochmal Mathias für die Hilfe.

Code: Alles auswählen

 
procedure TForm1.Button4Click(Sender: TObject);
var sa :TStringArray;
    zaehler  :Integer;
    s  :String;
begin
 
   ListBox1.Items.LoadFromFile(CSVFileName);
   s := ListBox1.Items.Text;
 
   sa := s.Split(';');
   zaehler := -1;
 
   repeat
     zaehler := zaehler+1;
     ListBox2.Items.Add((sa[0+zaehler]) + (sa[1+zaehler]));
 
     until zaehler > Length(sa);
    ShowMessage(ListBox2.Items.Text);
  end
 

Mathias
Beiträge: 6164
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Stringlist-Daten verarbeiten

Beitrag von Mathias »

Du muss die StringList (ListBox.Items) in eine extra Schleife nehem, so das du Zeile für Zeile durcharbeiten kannst.

Code: Alles auswählen

var
  s: string;
  sa: TStringArray;
  i, j: Integer;
begin
  ListBox1.Items.LoadFromFile('unit1.pas');
  for i := 0 to ListBox1.Count - 1 do begin
    sa := ListBox1.Items[i].Split(' ');
    s:='';
    for j := 0 to Length(sa) - 1 do begin
      s:=s+'<'+sa[j]+'> ';
    end;
    WriteLn(s);
  end

Wieso verwendest du eine ListBox, für so was wäre eine Memo besser geeignet.

PS: Mit deiner repeat until Schleife macht du nicht anderes, wie mit einer for to.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

dash_develop
Beiträge: 38
Registriert: So 15. Mai 2016, 13:33

Re: Stringlist-Daten verarbeiten

Beitrag von dash_develop »

Dank Mathias bin ich jetzt schon viel weiter:

Mein Code sieht jetzt so aus und ich bin soweit zufrieden:

Code: Alles auswählen

 
procedure TForm1.Button1Click(Sender: TObject);
var
  s: String;
  SLArray: TStringArray;
  i, j, zaehler1,zaehler2, Zeilenende,Spaltenende : Integer;
begin
  ListBox1.Items.LoadFromFile(CSVFile);
  s  := ListBox1.Items.Text;
  SLArray := s.Split(';');
 
  Zeilenende  := 4;
  Spaltenende := ListBox1.Items.Count;
  zaehler1    := 0;
  zaehler2    := 0;
  repeat
  ListBox1.Items.Add('512 ' + SLArray[0+zaehler1] + ' ' + SLArray[1+zaehler1] );
  ListBox1.Items.Add('513 ' + SLArray[2+zaehler1]);
  ListBox1.Items.Add('514 ' + SLArray[3+zaehler1]);
  zaehler1  := zaehler1 + Zeilenende;
  zaehler2  := zaehler2 + 1;
  until zaehler2 >= Spaltenende;
end;
 


Wie man sehen kann ist mein Zeilenende der CSV noch fest eingetragen.

Gibt es dafür auch eine Möglichkeit die anhand eines Counts zu ermitteln?

Spalten funktioniert ja einfach mit

Code: Alles auswählen

Spaltenende := ListBox1.Items.Count;


Kann man auch zwei verschiedene Delimiter benutzen?

Über jede Hilfe wäre ich dankbar. :)

Gruß
Dash_develop

Mathias
Beiträge: 6164
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Stringlist-Daten verarbeiten

Beitrag von Mathias »

Kann man auch zwei verschiedene Delimiter benutzen?

Meinst du so was ?

Code: Alles auswählen

s.Split([' ', ';']);     


Wie man sehen kann ist mein Zeilenende der CSV noch fest eingetragen.

Gibt es dafür auch eine Möglichkeit die anhand eines Counts zu ermitteln?

Mit Length(SLArray) oder Length(s), müsste man die Zeilenlänge ermitteln können.

Wieso hast du eine repaet until Schleife, anstelle einer for to ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

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

Re: Stringlist-Daten verarbeiten

Beitrag von wp_xyz »

Ich fürchte, das wird nix..

Habe ich das Problem richtig verstanden? Du hast eine aus Excel exportierte Text-Datei, in der jede Zeile die Parameter-Werte enthält, die in die Strings einer Maskendatei an eine bestimmte Stelle eingesetzt weren sollen. Pro Zeile der Text-Datei gibt es drei Maskenzeilen: Satzart 512, 513 und 514. Satzart 512 erhält das Datum (1. Parameter, oder in der üblichen bei 0 beginnenden Zählweise: Parameter mit Index 0) und "Überschrift 1" (Parameter mit Index 1), etc. Wie Satzart 519 funktioniert, habe ich nicht verstanden - das lasse ich jetzt mal außen vor.

Ich würde mir für jede Satz-Art einen String definieren und dort an die Stelle, die durch den Parameter ersetzt werden soll, ein Symbol einsetzen, am einfachsten '$0', '$1', etc. '$', weil es sonst nicht vorkommt, und die lfd. Nummern entsprechend den Parameter-Indices.

Code: Alles auswählen

const
  SATZART_511 = 'SATZART 511: 51101156196419849   498419 19 19 189 4 89494949 49 49 4 984   0';
  SATZART_512 = 'SATZART 512: 51201213<$0>      adsfasd <$1>   d fasd';
  SATZART_513 = 'SATZART 513: 51301 4<$2>   <$3>           1964191asdfasdf';
  SATZART_514 = 'SATZART 514: 514046                      <$4>';

Dann würde ich per StringReplace das Symbol durch den entsprechenden Parameter-Wert ersetzen:

Code: Alles auswählen

        L.Add(SATZART_511)// L ist eine StringList
        s := SATZART_512;
        s := StringReplace(s, '$0', sArr[0], []);
        s := StringReplace(s, '$1', sArr[1], []);
        L.Add(s);
       ....     

Schau dir das angehängte Projekt an, dann verstehst du sicher, was ich meine.
Dateianhänge
vda4905.zip
(2.64 KiB) 51-mal heruntergeladen

dash_develop
Beiträge: 38
Registriert: So 15. Mai 2016, 13:33

Re: Stringlist-Daten verarbeiten

Beitrag von dash_develop »

Hallo Mathias,

Code: Alles auswählen

Wieso hast du eine repaet until Schleife, anstelle einer for to ?

Weil es für mich irgendwie einfacher ist. Gibt's da Vor- oder Nachteile bei einer "FOR TO-Schleife"?

Hallo wp_xyz,

Code: Alles auswählen

Habe ich das Problem richtig verstanden? Du hast eine aus Excel exportierte Text-Datei, in der jede Zeile die Parameter-Werte enthält, die in die Strings einer Maskendatei an eine bestimmte Stelle eingesetzt weren sollen. Pro Zeile der Text-Datei gibt es drei Maskenzeilen: Satzart 512, 513 und 514. Satzart 512 erhält das Datum (1. Parameter, oder in der üblichen bei 0 beginnenden Zählweise: Parameter mit Index 0) und "Überschrift 1" (Parameter mit Index 1), etc.

Ja, genau das war mein Vorhaben.

Code: Alles auswählen

Wie Satzart 519 funktioniert, habe ich nicht verstanden - das lasse ich jetzt mal außen vor.

Satzart 519 kommt nur am Ende einmal vor und muss wiedergeben wie oft Satzart 511, 512, 513 und 514 vorgekommen ist.

Das heißt einfach so:

Code: Alles auswählen

SATZART 519: 51901000000010000000400000004000000040000000000000000000


Ich werde mir das gleich mal anschauen und werde versuchen das Ganze zu verstehen, wie du da vorgehst.

Gruß
dash_develop

Antworten