Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Textdateien zusammenfassen - irgedwie falsch (https://www.delphipraxis.net/193230-textdateien-zusammenfassen-irgedwie-falsch.html)

stifflersmom 7. Jul 2017 15:38

Textdateien zusammenfassen - irgedwie falsch
 
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ß

himitsu 7. Jul 2017 16:30

AW: Textdateien zusammenfassen - irgedwie falsch
 
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;

mkinzler 7. Jul 2017 16:38

AW: Textdateien zusammenfassen - irgedwie falsch
 
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.

himitsu 7. Jul 2017 16:47

AW: Textdateien zusammenfassen - irgedwie falsch
 
Zitat:

Zitat von mkinzler (Beitrag 1376229)
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).

hoika 7. Jul 2017 17:18

AW: Textdateien zusammenfassen - irgedwie falsch
 
Hallo,
ist der Header wirklich nur 1 Zeile lang?

Was ist denn konkret falsch?

stifflersmom 7. Jul 2017 17:27

AW: Textdateien zusammenfassen - irgedwie falsch
 
Zitat:

Zitat von himitsu (Beitrag 1376228)
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

stifflersmom 7. Jul 2017 17:28

AW: Textdateien zusammenfassen - irgedwie falsch
 
Zitat:

Zitat von himitsu (Beitrag 1376228)
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.

stifflersmom 7. Jul 2017 17:33

AW: Textdateien zusammenfassen - irgedwie falsch
 
Zitat:

Zitat von hoika (Beitrag 1376233)
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

himitsu 7. Jul 2017 17:54

AW: Textdateien zusammenfassen - irgedwie falsch
 
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
Delphi-Quellcode:
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.

HolgerX 7. Jul 2017 18:33

AW: Textdateien zusammenfassen - irgedwie falsch
 
Zitat:

Zitat von himitsu (Beitrag 1376238)
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 ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:46 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