![]() |
AW: TStringlist wieder mit Trennzeichen speichern
@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. |
AW: TStringlist wieder mit Trennzeichen speichern
Zitat:
|
AW: TStringlist wieder mit Trennzeichen speichern
was meinst Du mit hängt?
Mit der Routine bekomme ich alle Spalteneinträge im Memo angezeigt.
Delphi-Quellcode:
Im Memo steht dann:
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;
Code:
Die Datei besteht aus der Zeile:
0193433020
2301000953 CNC-DB 3302060000 drehen01 300 ---- ---- ---- ----
Code:
Grüße
0193433020;2301000953;CNC-DB;3302060000;drehen01;300;;;;
Klaus |
AW: TStringlist wieder mit Trennzeichen speichern
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 |
AW: TStringlist wieder mit Trennzeichen speichern
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.:-D
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 = 'RB' then begin Meldung.Caption := 'skip RB';//zu Testzweck später löschen logdatei(log); end else if Messstation = 'CNC-FB' then 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; |
AW: TStringlist wieder mit Trennzeichen speichern
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? :zwinker:
Delphi-Quellcode:
Aber da dieser Code wohl eh bald gelöscht wird ... naja.
write(Datei, Artikelnummer, ';');
write(Datei, '10', ';'); write(Datei, Kapazitaet, ';'); write(Datei, '1', ';'); write(Datei, '1', ';'); write(Datei, '', ';'); write(Datei, Auftragsnummer, ';'); write(Datei, ''); PS: ![]()
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; |
AW: TStringlist wieder mit Trennzeichen speichern
Für ein neues Problem erstelle bitte auch einen neuen Thread.
|
AW: TStringlist wieder mit Trennzeichen speichern
Danke für die Delphi Tips mit
Delphi-Quellcode:
und
TFile.WriteAllText
Delphi-Quellcode:
. Das ist natürlich sehr übersichtlich im code und mal gar nicht fehleranfällig. :-) Für Lazarus habe ich das noch nicht gefunden.
TFile.WriteAllLines
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:
@Luckie: Ja, das werde ich machen. |
AW: TStringlist wieder mit Trennzeichen speichern
Vor dem Create ein try und vor dem Free das finally. Was gibt es da auf dem Schirm zu haben? :?
|
AW: TStringlist wieder mit Trennzeichen speichern
Zitat:
Gruß K-H |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:17 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz