AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Textdateien zusammenfassen - irgedwie falsch

Ein Thema von stifflersmom · begonnen am 7. Jul 2017 · letzter Beitrag vom 7. Jul 2017
Antwort Antwort
stifflersmom

Registriert seit: 8. Dez 2005
Ort: 24994 Holt
374 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

Textdateien zusammenfassen - irgedwie falsch

  Alt 7. Jul 2017, 15:38
Moin,

ich versuche hier ein paar CSV-Dateien aus einem Datev-Export in einer neuen Textdatei zusammen zu fassen (der Anwender soll nachher nicht x-Mal den Imoportvorgang starten müssen).
Dazu lese ich aus einem Verzeichnis die darin enthaltenen Dateien ein und schiebe den Inhalt dann in ein memo um den Inhalt dann nachher in eine Datei zu exportieren.
Theoretisch funktioniert das auch, aber:
Ich will den Header aus den exportdateien nur einmal in meiner zusammengefassten Datei haben und irgendwie werden da auch Zeilen doppelt übertragen, ich weiß nur nicht wieso.

Hier mal der Code:
Delphi-Quellcode:
procedure TfDatevBuchungsstapelimport.ReadDatevCSV;
const sDir = '\\blabla\freigabe\pawi\import\datev\';
Var sl_files : TstringList;
    sl_content : TstringList;
    i,y : Integer;
begin
 Screen.Cursor := crHourGlass;
 sl_files := TstringList.Create();
 GetFilesInDirectory(sDir, '*.txt',sl_files,False);
 memo_datev.Lines.Clear;
 memo_datev.Visible := False;

 For I := 0 to sl_files.Count - 1 Do
  Begin
   sl_content := TstringList.Create();
       sl_content.LoadFromFile(sDir+sl_files[i]);
       // den Header aus der Exportdatei wollen wir nur einmal haben...
       If I >0 Then sl_content.Delete(0);

       memo_datev.Lines.AddStrings(sl_content);
       sl_content.Free;
  End;
 If memo_datev.Lines.Text <> 'Then memo_datev.Lines.SaveToFile(sDir+'_Buchungen.csv');
 If memo_datev.Lines.Text <> 'Then memo_datev.Lines.SaveToFile(sDir+'Buchungen.csv');

 sl_files.Free;
 Screen.Cursor := crDefault;
end;
Sieht hier jemand meinen Fehler?

Gruß
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Textdateien zusammenfassen - irgedwie falsch

  Alt 7. Jul 2017, 16:30
TMemo als Zwischenspeicher, warum ein Langsames Memo, anstatt einer TStirngList?

Was heißt "doppelt", bzw. welche Zeilen sind doppelt
und sicher, dass sie nicht doch mehrfach in den Dateien drin sind?

Ich seh jetzt auch nichts im Code, was Zeilen vermehren sollte.


Na gut, dass sl_content ständig gelöscht und neu erstellt wird, wäre zu verkrafen, aber für die fehlenden Ressourcenschutzblöcke sollte jemand mindestens ausgepeitscht werden.



Der Selbe Code,
* nur ohne die Arbeit im Memo zu machen,
* mit einem Schutzblock
* und im Debugger kann man sich auch wunderschön ansehn, wie nach und nach sl_allcontent voller wird und was jederzeit sich darin befindet.
Delphi-Quellcode:
procedure TfDatevBuchungsstapelimport.ReadDatevCSV;
...
begin
  Screen.Cursor := crHourGlass;
  sl_files := TStringList.Create;
  sl_newcontent := TStringList.Create;
  sl_allcontent := TStringList.Create; // Ja 3x ... bei diesem Create kann es eigentlich nie knallen und wenn, dann ist eh alles zu spät (OutOfMemory, BufferOverun usw.)
  try
    GetFilesInDirectory(sDir, '*.txt', sl_files, False);
    for I := 0 to sl_files.Count - 1 do begin
      sl_content.LoadFromFile(sDir + sl_files[i]);
      if I > 0 then
        sl_content.Delete(0); // den Header aus der Exportdatei wollen wir nur einmal haben...
      sl_allcontent.AddStrings(sl_content);
    end;
    if sl_allcontent.Count <> 0 then begin
      sl_allcontent.SaveToFile(sDir + '_Buchungen.csv');
      sl_allcontent.SaveToFile(sDir + 'Buchungen.csv');
    end;
    memo_datev.Visible := False;
    memo_datev.Text := sl_allcontent.Text; // kein AddStrings, da TMemo im Einzelzeilenzugriff arschlahm ist
  finally
    sl_files.Free;
    sl_newcontent.Free;
    sl_allcontent.Free;
    Screen.Cursor := crDefault;
  end;
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 ( 7. Jul 2017 um 16:41 Uhr)
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Textdateien zusammenfassen - irgedwie falsch

  Alt 7. Jul 2017, 16:38
Jede datei hat einen Header, wenn man mehrere Dateien aneinanderhängt ist der Header dann natürlich mehrfach vorhanden.

Ab der 2. Datei erst ab der 3. Zeile Anhängen.
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Textdateien zusammenfassen - irgedwie falsch

  Alt 7. Jul 2017, 16:47
Jede datei hat einen Header, wenn man mehrere Dateien aneinanderhängt ist der Header dann natürlich mehrfach vorhanden.
Er löscht doch schon ab der zweiten Datei den Header (jeweils die erste Zeile).
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.270 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Textdateien zusammenfassen - irgedwie falsch

  Alt 7. Jul 2017, 17:18
Hallo,
ist der Header wirklich nur 1 Zeile lang?

Was ist denn konkret falsch?
Heiko
  Mit Zitat antworten Zitat
stifflersmom

Registriert seit: 8. Dez 2005
Ort: 24994 Holt
374 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#6

AW: Textdateien zusammenfassen - irgedwie falsch

  Alt 7. Jul 2017, 17:27
TMemo als Zwischenspeicher, warum ein Langsames Memo, anstatt einer TStirngList?

Na gut, dass sl_content ständig gelöscht und neu erstellt wird, wäre zu verkrafen, aber für die fehlenden Ressourcenschutzblöcke sollte jemand mindestens ausgepeitscht werden.
das Memo habe ich gewählt, um schnell zu sehen was da zusammengewürfelt wird, ist jetzt also nur in der Testentwicklung interessant.

"Doppelt ausgepeitscht"... du Frechdachs...
Nein, das Ganze ist so ein schnell hingepfuschter Block. Die Fehlerbehandlung hätte ich für den abschließenden Code noch reingemacht
  Mit Zitat antworten Zitat
stifflersmom

Registriert seit: 8. Dez 2005
Ort: 24994 Holt
374 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#7

AW: Textdateien zusammenfassen - irgedwie falsch

  Alt 7. Jul 2017, 17:28
Was heißt "doppelt", bzw. welche Zeilen sind doppelt
und sicher, dass sie nicht doch mehrfach in den Dateien drin sind?
Tatsächlich sind die betreffenden Zeilen wirklich mehrfach vorhanden, da hat mit der Datev-export einen Strich durch die Rechnung gemacht. Bzw. ich hatte an der Stelle zu kurz gedacht.
  Mit Zitat antworten Zitat
stifflersmom

Registriert seit: 8. Dez 2005
Ort: 24994 Holt
374 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#8

AW: Textdateien zusammenfassen - irgedwie falsch

  Alt 7. Jul 2017, 17:33
Hallo,
ist der Header wirklich nur 1 Zeile lang?

Was ist denn konkret falsch?
Ja, der Header ist in jeder Datei eine Zeile lang und sieht so aus:
Umsatz (ohne Soll/Haben-Kz);Soll/Haben-Kennzeichen;WKZ Umsatz;Kurs;Basis-Umsatz;WKZ Basis-Umsatz;Konto;Gegenkonto (ohne BU-Schlüssel);BU-Schlüssel;Belegdatum;Belegfeld 1;Belegfeld 2;Skonto;Buchungstext;Postensperre;Diverse Adressnummer;Geschäftspartnerbank;Sachverhalt;Zins sperre;Beleglink;Beleginfo - Art 1;Beleginfo - Inhalt 1;Beleginfo - Art 2;Beleginfo - Inhalt 2;Beleginfo - Art 3;Beleginfo - Inhalt 3;Beleginfo - Art 4;Beleginfo - Inhalt 4;Beleginfo - Art 5;Beleginfo - Inhalt 5;Beleginfo - Art 6;Beleginfo - Inhalt 6;Beleginfo - Art 7;Beleginfo - Inhalt 7;Beleginfo - Art 8;Beleginfo - Inhalt 8;KOST1 - Kostenstelle;KOST2 - Kostenstelle;Kost-Menge;EU-Land u. UStID;EU-Steuersatz;Abw. Versteuerungsart;Sachverhalt L+L;Funktionsergänzung L+L;BU 49 Hauptfunktionstyp;BU 49 Hauptfunktionsnummer;BU 49 Funktionsergänzung;Zusatzinformation - Art 1;Zusatzinformation- Inhalt 1;Zusatzinformation - Art 2;Zusatzinformation- Inhalt 2;Zusatzinformation - Art 3;Zusatzinformation- Inhalt 3;Zusatzinformation - Art 4;Zusatzinformation- Inhalt 4;Zusatzinformation - Art 5;Zusatzinformation- Inhalt 5;Zusatzinformation - Art 6;Zusatzinformation- Inhalt 6;Zusatzinformation - Art 7;Zusatzinformation- Inhalt 7;Zusatzinformation - Art 8;Zusatzinformation- Inhalt 8;Zusatzinformation - Art 9;Zusatzinformation- Inhalt 9;Zusatzinformation - Art 10;Zusatzinformation- Inhalt 10;Zusatzinformation - Art 11;Zusatzinformation- Inhalt 11;Zusatzinformation - Art 12;Zusatzinformation- Inhalt 12;Zusatzinformation - Art 13;Zusatzinformation- Inhalt 13;Zusatzinformation - Art 14;Zusatzinformation- Inhalt 14;Zusatzinformation - Art 15;Zusatzinformation- Inhalt 15;Zusatzinformation - Art 16;Zusatzinformation- Inhalt 16;Zusatzinformation - Art 17;Zusatzinformation- Inhalt 17;Zusatzinformation - Art 18;Zusatzinformation- Inhalt 18;Zusatzinformation - Art 19;Zusatzinformation- Inhalt 19;Zusatzinformation - Art 20;Zusatzinformation- Inhalt 20;Stück;Gewicht;Zahlweise;Forderungsart;Veranlagu ngsjahr;Zugeordnete Fälligkeit;Skontotyp;Auftragsnummer;Buchungstyp;US t-Schlüssel (Anzahlungen);EU-Land (Anzahlungen);Sachverhalt L+L (Anzahlungen);EU-Steuersatz (Anzahlungen);Erlöskonto (Anzahlungen);Herkunft-Kz;Buchungs GUID;KOST-Datum;SEPA-Mandatsreferenz;Skontosperre;Gesellschaftername;Be teiligtennummer;Identifikationsnummer;Zeichnernumm er;Postensperre bis;Bezeichnung SoBil-Sachverhalt;Kennzeichen SoBil-Buchung;Festschreibung;Leistungsdatum;Datum Zuord. Steuerperiode

Allerdings taucht dieser Header, trotz meiner Löschung des ersten Eintrages in der sl_content, mehrfach in der Augabedatei auf...
Delphi-Quellcode:
      if I > 0 then
        sl_content.Delete(0); // den Header aus der Exportdatei wollen wir nur einmal haben...
stop, alle Kraft zurück:
Jetzt sehe ich, dass Datev diesen "Header" in einer Exportdatei zwei Mal hinterlassen hat, wieso auch immer.

Abschließend ist also an dieser Stelle von meiner Seite aus, bis auf das fehledne try finally, nichts falsch gelaufen.

Danke trotzdem

Geändert von stifflersmom ( 7. Jul 2017 um 17:35 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Textdateien zusammenfassen - irgedwie falsch

  Alt 7. Jul 2017, 17:54
Wenn doppelte Header sowieso "erlaubt" sind, dann könnte man auch Alle drin lassen.

Oder zu weißt wie der Header aussieht, bzw. anfängt und löschst alle Zeilen, die z.B. mit Umsatz (ohne Soll/Haben-Kz); beginnen.

Doppelte Zeilen zu entfernen wäre jetzt auch nicht das große Problem.
Die Stringliste am Ende noch einmal durchlaufen (count-1 downto 0), mit IndexOf schauen, ob die Zeile (nochmal) gefunden wird, also gefundener Index kleiner als der aktuelle Index, und wenn ja, dann die aktuelle Zeile (I) löschen.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
961 Beiträge
 
Delphi 6 Professional
 
#10

AW: Textdateien zusammenfassen - irgedwie falsch

  Alt 7. Jul 2017, 18:33
Doppelte Zeilen zu entfernen wäre jetzt auch nicht das große Problem.
Die Stringliste am Ende noch einmal durchlaufen (count-1 downto 0), mit IndexOf schauen, ob die Zeile (nochmal) gefunden wird, also gefundener Index kleiner als der aktuelle Index, und wenn ja, dann die aktuelle Zeile (I) löschen.


Und damit würden auch die zu vielen identischen Header gelöscht
  Mit Zitat antworten Zitat
Antwort Antwort


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 06:32 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