AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein TStringlist wieder mit Trennzeichen speichern
Thema durchsuchen
Ansicht
Themen-Optionen

TStringlist wieder mit Trennzeichen speichern

Ein Thema von zaphood · begonnen am 19. Jan 2020 · letzter Beitrag vom 27. Jan 2020
Antwort Antwort
Seite 2 von 3     12 3      
zaphood

Registriert seit: 19. Jan 2020
Ort: Hattingen
11 Beiträge
 
FreePascal / Lazarus
 
#11

AW: TStringlist wieder mit Trennzeichen speichern

  Alt 22. Jan 2020, 12:53
@einbeliebigername:
bei Writeln('vSl.Count: '+ vSl.Count.ToString) steigt mein Lazarus aus mit einem Fehler.

@Klaus01:
Ja genau ich möchte gerne mit den einzelnen Zeilen arbeiten(z.B. Messstation := sl.Strings[2])
Damit ich die mit if abfragen kann und sehr leicht wieder zusammensetzen kann wie ich den String benötige.
Leider komme ich mit Deinem Tipp mit der zweiten Stringlist nicht weiter.
Bei der Zuweisung des Index0 mit slZeile[0]... hänge ich.
Dirk
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#12

AW: TStringlist wieder mit Trennzeichen speichern

  Alt 22. Jan 2020, 13:16
@einbeliebigername:
bei Writeln('vSl.Count: '+ vSl.Count.ToString) steigt mein Lazarus aus mit einem Fehler.
Und welchem?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.754 Beiträge
 
Delphi 10.4 Sydney
 
#13

AW: TStringlist wieder mit Trennzeichen speichern

  Alt 22. Jan 2020, 13:22
was meinst Du mit hängt?

Mit der Routine bekomme ich alle Spalteneinträge im Memo angezeigt.

Delphi-Quellcode:
var
  sl: TStringList;
  slZeile: TStringList;
  zeile,spalte: Integer;
begin
 sl := TStringList.Create;
 try
   sl.LoadFromFile('e:\test.txt');
   for zeile:=0 to sl.Count -1 do
     begin
       slZeile := TStringList.Create;
       try
         slZeile.Delimiter := ';';
         slZeile.DelimitedText := sl[zeile];
         for spalte := 0 to slZeile.Count -1 do
           if slZeile[spalte] = 'then
             memo1.Lines.Add('----')
           else
             memo1.Lines.Add(slZeile[spalte]);
       finally
         slZeile.Free;
       end;
     end;
 finally
   sl.Free;
 end;
end;
Im Memo steht dann:
Code:
0193433020
2301000953
CNC-DB
3302060000
drehen01
300
----
----
----
----
Die Datei besteht aus der Zeile:
Code:
0193433020;2301000953;CNC-DB;3302060000;drehen01;300;;;;
Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
zaphood

Registriert seit: 19. Jan 2020
Ort: Hattingen
11 Beiträge
 
FreePascal / Lazarus
 
#14

AW: TStringlist wieder mit Trennzeichen speichern

  Alt 22. Jan 2020, 13:47
Danke Klaus das sieht sehr gut aus und wird heute Abend eingebaut.

Es wird dann noch eine dritte Stringlist gebaut.
1.SL zum laden der txt Datei
2.SL zum Erstellen der Index[0...x] Möglichkeit
3.SL zum Erstellen der richtigen Reihenfolge und späteren speichern als txt Datei

Schöne Grüße
Dirk
  Mit Zitat antworten Zitat
zaphood

Registriert seit: 19. Jan 2020
Ort: Hattingen
11 Beiträge
 
FreePascal / Lazarus
 
#15

AW: TStringlist wieder mit Trennzeichen speichern

  Alt 22. Jan 2020, 16:09
Das mit der dritten Stinglist war Quatsch von mir, da ja aus der zweiten indexfähigen Stinglist die Textdatei gebaut wird. Vielen Dank nochmal, es klappt prima.

Das Tool soll eine Schnittstelle zwischen einem ERP und CAQ System realisieren. Wenn ein CNC Bediener einen neuen Auftrag beginnt wird ein Barcode gescannt um dann diese SPC Datei mit Infos über Auftragsnummer, Artikelnummer usw. erzeugen. Das CAQ System importiert diese Daten und erzeugt einen Prüfauftrag auf einem Messrechner mit angeschlossenen Messmitteln um die Teile zu vermessen und überprüfen. Das alte CAQ System wird abgelöst und das neue braucht die Daten in einer anderen definierten Reihenfolge und mit zusätzlichen Werten. Dies wird tatsächlich teilweise immer noch mit kleinen Textfiles realisiert.

Eigentlich bin ich Instandhalter/IT'ler und pflege nur den ERP/CAQ Server und repariere die CNC-Maschinen aber mich hat das Thema interessiert, da ich in meiner Technikerausbildung vor 15 Jahren mal mit Delphi programmiert habe. Leider bin ich wie beim Arduino/ESP eher der Codebettler- und klauer.
Das Tool schreibe ich in meiner Freizeit und bekomme keine Entlohnung dafür und ein Verbesserungswesen gibt es auch nicht. Ich sehe es als Hobby an wie Sodoku um nicht einzurosten und vielleicht hilft es ja mal jemand anderen der ein ähnliches Problem mit txt Schnittstellen hat.


Die nächste Hürde für heute Abend wird das Laden der realen Datei werden. Es soll ein Verzeichnis überwacht werden wo Dateien sporadisch ankommen welche einen Zähler im Dateinamen beinhalten. Also immer unterschiedlich heissen.
SPC0001.txt
SPC0002.txt
SPC0003.txt
Nach dem Bearbeiten wird die Quell-Datei gelöscht und die veränderte Ziel-Datei woanders geschrieben. Versuchen werde ich es mit FindFirst und FindNext bis das Verzeichnis leer ist.
Da es nicht zeitkritisch ist dachte ich an alle 2 Minuten für die Überprüfung ob was da ist.

Delphi-Quellcode:
procedure logdatei(Uebergabe: String);
var
  f : TextFile;
begin
  AssignFile(f, 'SPC.log'); //SPC.log muss vorhanden sein vor dem ersten Start quick and dirty
  Append(f);
  writeln(f, Uebergabe);
  CloseFile(f);
end;


procedure TForm1.Button1Click(Sender: TObject);
var
  sl,slZeile : tstringlist;
  zeile : Integer;
  Auftragsnummer, Artikelnummer, Messstation, Kapazitaet : String;
  Datei : TextFile;
  Filename : String;
  Datum : String;
  log : String;

begin
  sl := TStringList.Create;
    try
      sl.LoadFromFile('SPC.txt');
      for zeile:=0 to sl.Count -1 do
        begin
          slZeile := TStringList.Create;
          try
            slZeile.Delimiter := ';';
            slZeile.DelimitedText := sl[zeile];
            Auftragsnummer := slZeile.Strings[0];
            Artikelnummer := slZeile.Strings[1];
            Messstation := slZeile.Strings[2];
            Kapazitaet := slZeile.Strings[3];
          finally
            Datum := FormatDateTime('yyyy_mm_dd__hh_mm_ss', Now);
            Filename := 'bdecn.' + Datum + '.dat';
            log := Datum+' '+slZeile.DelimitedText;
            if Messstation = 'RBthen
                begin
                 Meldung.Caption := 'skip RB';//zu Testzweck später löschen
                 logdatei(log);
                end
            else
              if Messstation = 'CNC-FBthen
                 begin
                  Meldung.Caption := 'skip CNC-FB';//zu Testzweck später löschen
                  logdatei(log);
                 end
            else
              begin
               Meldung.Caption := 'Datei ok';//zu Testzweck später löschen
               logdatei(log);
               AssignFile(Datei, Filename);
               Rewrite(Datei);
               write(Datei, Artikelnummer);
               write(Datei, ';');
               write(Datei, '10');
               write(Datei, ';');
               write(Datei, Kapazitaet);
               write(Datei, ';');
               write(Datei, '1');
               write(Datei, ';');
               write(Datei, '1');
               write(Datei, ';');
               write(Datei, ';');
               write(Datei, Auftragsnummer);
               write(Datei, ';');
               CloseFile(Datei);
               slZeile.Free;
             end;
          end;
       end;
    finally
      sl.Free;
  end;
 end;
Dirk

Geändert von zaphood (22. Jan 2020 um 16:52 Uhr) Grund: edit2
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.115 Beiträge
 
Delphi 12 Athens
 
#16

AW: TStringlist wieder mit Trennzeichen speichern

  Alt 22. Jan 2020, 17:34
Diese vielen WRITE lassen kaum erkennen was wo steht.
Wie wäre es, wenn man eine Zeile im Code mit einer Spalte in der Datei gleichsetzt?
Delphi-Quellcode:
write(Datei, Artikelnummer, ';');
write(Datei, '10', ';');
write(Datei, Kapazitaet, ';');
write(Datei, '1', ';');
write(Datei, '1', ';');
write(Datei, '', ';');
write(Datei, Auftragsnummer, ';');
write(Datei, '');
Aber da dieser Code wohl eh bald gelöscht wird ... naja.

PS: Delphi-Referenz durchsuchenTFile.WriteAllLines
Delphi-Quellcode:
// schade dass hier dieses blöde TStringDynArray als Parameter verwendet wird
//uses IOUtils; // im Delphi, aber FPC hat bestimmt auch irgendwo sowas
TFile.WriteAllLines(Filename, [Artikelnummer, ';', '10', ';', Kapazitaet,
  ';', '1', ';', '1', ';', ';', Auftragsnummer, ';']);

// aber niemand verbietet dir, dass du dir selbst eine Hilfsfunktion schreibst ;)
//procedure WriteToCSV(Filename: string; Columns: array of const);
WriteToCSV(Filename, [Artikelnummer, 10, Kapazitaet, 1, 1, '', Auftragsnummer]);



"slZeile" und "Datei" haben auch noch kein Finally.

PS: man kann auch verschachteltn.
Delphi-Quellcode:
A := TXyz.Create;
try
  B := TXyz.Create;
  try
    ...
  finally
    B.Free;
  end;
finally
  A.Free;
end;
Delphi-Quellcode:
A := TXyz.Create;
B := TXyz.Create; // wenn es im Cnstructor nicht knallen kann
try
  ...
finally
  B.Free; // natürlich nur, wenn das Free hier auch nie knallen wird
  A.Free;
end;
Delphi-Quellcode:
B := nil;
A := TXyz.Create;
try
  B := TXyz.Create;
  ...
  //FreeAndNil(B); // wenn erwünscht, ABER kein B.Free; hier drin
  ...
finally
  B.Free;
  A.Free;
end;
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (22. Jan 2020 um 17:37 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#17

AW: TStringlist wieder mit Trennzeichen speichern

  Alt 22. Jan 2020, 21:14
Für ein neues Problem erstelle bitte auch einen neuen Thread.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
zaphood

Registriert seit: 19. Jan 2020
Ort: Hattingen
11 Beiträge
 
FreePascal / Lazarus
 
#18

AW: TStringlist wieder mit Trennzeichen speichern

  Alt 23. Jan 2020, 05:22
Danke für die Delphi Tips mit TFile.WriteAllText und TFile.WriteAllLines . Das ist natürlich sehr übersichtlich im code und mal gar nicht fehleranfällig. Für Lazarus habe ich das noch nicht gefunden.
Die Delphi 10.3 habe ich auch hier und kann das testen. Weil ein Lazarus begeisteter Kollege mit Linux mitprogrammiert bin ich erst einmal dort gelandet.

Die try/finally Mechanismen habe ich noch nicht so auf dem Schirm. Aber kommen noch reinn wo sie hingehören.
Zitat:
Aber da dieser Code wohl eh bald gelöscht wird ... naja.
@himitsu: Wie meinst Du das?

@Luckie: Ja, das werde ich machen.
Dirk
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#19

AW: TStringlist wieder mit Trennzeichen speichern

  Alt 23. Jan 2020, 07:40
Vor dem Create ein try und vor dem Free das finally. Was gibt es da auf dem Schirm zu haben?
Michael
Ein Teil meines Codes würde euch verunsichern.

Geändert von Luckie (23. Jan 2020 um 13:48 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#20

AW: TStringlist wieder mit Trennzeichen speichern

  Alt 23. Jan 2020, 08:58
Vor dem Create ein des und vor dem Free das finally. Was gibt es da auf dem Schirm zu haben?
Er hat noch keine Ahnung wofür Try..Finally gut ist, und was noch unangenehmer ist, er hat noch keine Ahnung wieviel Aufwand getrieben werden muß um mögliche Fehler zu behandeln.

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:33 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz