Stringlist-Daten verarbeiten

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

Stringlist-Daten verarbeiten

Beitragvon dash_develop » 6. Apr 2017, 18:36 Stringlist-Daten verarbeiten

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
dash_develop
 
Beiträge: 38
Registriert: 15. Mai 2016, 12:33

Beitragvon Mathias » 6. Apr 2017, 18:59 Re: Stringlist-Daten verarbeiten

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 gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 3024
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon dash_develop » 6. Apr 2017, 20:07 Re: Stringlist-Daten verarbeiten

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: 15. Mai 2016, 12:33

Beitragvon dash_develop » 6. Apr 2017, 21:12 Re: Stringlist-Daten verarbeiten

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
 
dash_develop
 
Beiträge: 38
Registriert: 15. Mai 2016, 12:33

Beitragvon Mathias » 6. Apr 2017, 21:22 Re: Stringlist-Daten verarbeiten

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 gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 3024
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon dash_develop » 9. Apr 2017, 20:12 Re: Stringlist-Daten verarbeiten

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
dash_develop
 
Beiträge: 38
Registriert: 15. Mai 2016, 12:33

Beitragvon Mathias » 9. Apr 2017, 21:36 Re: Stringlist-Daten verarbeiten

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 gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 3024
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon wp_xyz » 10. Apr 2017, 10:11 Re: Stringlist-Daten verarbeiten

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.
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
wp_xyz
 
Beiträge: 2183
Registriert: 8. Apr 2011, 08:01

Beitragvon dash_develop » 10. Apr 2017, 11:07 Re: Stringlist-Daten verarbeiten

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
dash_develop
 
Beiträge: 38
Registriert: 15. Mai 2016, 12:33

• Themenende •

Zurück zu Einsteigerfragen



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste

porpoises-institution
accuracy-worried