Ein frohes, neues (nachträglich).
Ich hoffe, Ihr seid alle gut und gesund gerutscht?
Erst einmal lieben Dank für Eure Mühe.
Als ich nnniks Beitrag las, musste ich vor Schreck erstmal husten XD
Ich habe mal eine komplette CSV Testdatei angehängt, damit ich genau(er) erklären kann, was ich machen möchte/muss, denn ich denke, nnnik hat zwar alles richtig gemacht (DANKE dafür!), nur ich habe vielleicht falsch gefragt. Ich denke, meine bisherige Herangehensweise an das Problem ist/war falsch (?)
Aber seine Ausführungen haben evtl. ein wenig Licht für mich in diese verzwickten Klammern gebracht. Damit werde ich generell mal etwas üben.
In der Beispieldatei gibt es die Zeilen 4 bis 10, die sich EXAKT in den Zeilen 11 bis 17 wiederholen.
Der beinahe (!) gleiche Textblock wird dann nochmals in den darauf folgenden Zeilen ausgegeben.
Die Unterschiede liegen in der 3. Zahl von hinten, die dort eine 1 ist. Außerdem gibt es dort nicht die Zeilennummerierung 1, sondern diese Blöcke beginnen IMMER bei 2. Diese Textblöcke muss ich nicht filtern, sondern nur die EXAKTEN Kopien der Zeilen 4 bis 10, bzw. in längeren Dateien natürlich entsprechende Textblöcke.
Von den zu filternden Textblöcken könnte es theoretisch endlos viele geben, meist sind es aber nur 1 bis 2 Kopien. Sie liegen aber generell immer direkt hintereinander (also ab Zeile 11, 18, 25, u.s.w) . Es kann nicht sein, dass die Zeilen 4 bis 10 irgendwo bei 13983 nochmal kommen.
Meine Idee bisher ist (Ich bastel da aber noch an einem halbwegs lauffähigen Code), dass ich jede
Zuerst prüfe ich jedes Zeilenende auf ";1;0;0". Wird es gefunden und ist NICHT das Wort "REG" enthalten, wird die gesamte Überprüfung (der Loop) übersprungen, da diese Textblöcke ja erhalten bleiben sollen.
Dann prüfe ich in einer Schleife, ob die aktuelle Zeile vom 1. Zeichen bis zum "REG" identisch ist und speichere die laufende Nr. (im Beispiel die 7) in einer Variable und zähle diesen Vorgang, um nachher die Anzahl der gelöschten Kopien ausgeben zu können.
Ist dies auch der Fall, muss ich nur noch de Nummerierung er einzelnen Zeilen prüfen (die Zahl hinter "BEDIENER 1";0;). Diese ist immer fortlaufend, ich muss also nur vergleichen, ob der Wert der aktuellen Zeile niedriger oder höher ist als der der folgenden Zeile.
Der Text "BEDIENER 1" (darum auch meine Frage nach unbestimmten Zeichen), könnte z.B. auch "@Peter_~;." sein. Das ist zwar unwahrscheinlich, technisch aber möglich. Es können 0 bis max. 16 Zeichen sein (also auch "" ist möglich).
Bisher lese ich die CSV Datei in eine Variable ein und splitte dann jede Zeile in ein Array (CSV[1 ... n]). Aus diesem wollte ich dann die nicht benötigten Kopien einfach per
CSV.remove[A_Index] löschen und das Array danach in eine neue Datei zurück schreiben.
Hier zur Veranschaulichung der Teil, dessen exakte Kopien nachher fehlen müssen:
Code: Select all
04 0;0;20181227;09:41;7;0;"REG";1;"BEDIENER 1";0;1;256;"DEPT";1;"LADENVERKAUF";1;1.000;44.44;44.44;"B";0;0;0;0;0;0;0;0;0
05 0;0;20181227;09:41;7;0;"REG";1;"BEDIENER 1";0;2;256;"DEPT";1;"LADENVERKAUF";1;1.000;55.55;55.55;"B";0;0;0;0;0;0;0;0;0
06 0;0;20181227;09:41;7;0;"REG";1;"BEDIENER 1";0;3;2048;"ZWI.SUMME";0;" ";0;0.000;0.00;99.99;" ";0;0;0;0;0;0;0;0;0
07 0;0;20181227;09:41;7;0;"REG";1;"BEDIENER 1";0;4;10498;"UMSATZ 19 %";0;" ";0;0.000;0.00;99.99;" ";0;0;0;0;0;0;0;0;0
08 0;0;20181227;09:41;7;0;"REG";1;"BEDIENER 1";0;5;20738;"MWST";0;" ";0;0.000;0.00;15.96;" ";0;0;0;0;0;0;0;0;0
09 0;0;20181227;09:41;7;0;"REG";1;"BEDIENER 1";0;6;3330;"NETTO 19 %";0;" ";0;0.000;0.00;84.03;" ";0;0;0;0;0;0;0;0;0
10 0;0;20181227;09:41;7;0;"REG";1;"BEDIENER 1";0;7;4609;"BAR";0;" ";0;0.000;0.00;99.99;" ";0;0;0;0;0;0;0;0;0
Ich möchte nicht unbedingt, dass Ihr meine
Arbeit macht, daher verlange ich keine fertige Routine dafür. Viel lieber möchte ich (gerade was das RegEx) angeht, Eure Vorschläge, um daraus zu lernen und vllt. endlich mal dieses Thema ein wenig zu verstehen.
Kleiner Hinweis zum Schluss:
Diese CSV Datien können 1 bis ca. 3.000.000 Zeilen haben, meist sind es um die 800.000 bis 1.000.000. Darum auch dieser Aufwand, denn solche Dateien will wirklich niemand händisch durchsuchen
Vielen Dank fürs Lesen und natürlich denen, die sich noch dazu damit beschäftigen,
Gucky.
Ein frohes, neues (nachträglich).
Ich hoffe, Ihr seid alle gut und gesund gerutscht?
Erst einmal lieben Dank für Eure Mühe.
Als ich nnniks Beitrag las, musste ich vor Schreck erstmal husten XD
Ich habe mal eine komplette CSV Testdatei angehängt, damit ich genau(er) erklären kann, was ich machen möchte/muss, denn ich denke, nnnik hat zwar alles richtig gemacht (DANKE dafür!), nur ich habe vielleicht falsch gefragt. Ich denke, meine bisherige Herangehensweise an das Problem ist/war falsch (?)
Aber seine Ausführungen haben evtl. ein wenig Licht für mich in diese verzwickten Klammern gebracht. Damit werde ich generell mal etwas üben.
In der Beispieldatei gibt es die Zeilen 4 bis 10, die sich EXAKT in den Zeilen 11 bis 17 wiederholen.
Der beinahe (!) gleiche Textblock wird dann nochmals in den darauf folgenden Zeilen ausgegeben.
Die Unterschiede liegen in der 3. Zahl von hinten, die dort eine 1 ist. Außerdem gibt es dort nicht die Zeilennummerierung 1, sondern diese Blöcke beginnen IMMER bei 2. Diese Textblöcke muss ich nicht filtern, sondern nur die EXAKTEN Kopien der Zeilen 4 bis 10, bzw. in längeren Dateien natürlich entsprechende Textblöcke.
Von den zu filternden Textblöcken könnte es theoretisch endlos viele geben, meist sind es aber nur 1 bis 2 Kopien. Sie liegen aber generell immer direkt hintereinander (also ab Zeile 11, 18, 25, u.s.w) . Es kann nicht sein, dass die Zeilen 4 bis 10 irgendwo bei 13983 nochmal kommen.
Meine Idee bisher ist (Ich bastel da aber noch an einem halbwegs lauffähigen Code), dass ich jede
Zuerst prüfe ich jedes Zeilenende auf ";1;0;0". Wird es gefunden und ist NICHT das Wort "REG" enthalten, wird die gesamte Überprüfung (der Loop) übersprungen, da diese Textblöcke ja erhalten bleiben sollen.
Dann prüfe ich in einer Schleife, ob die aktuelle Zeile vom 1. Zeichen bis zum "REG" identisch ist und speichere die laufende Nr. (im Beispiel die 7) in einer Variable und zähle diesen Vorgang, um nachher die Anzahl der gelöschten Kopien ausgeben zu können.
Ist dies auch der Fall, muss ich nur noch de Nummerierung er einzelnen Zeilen prüfen (die Zahl hinter "BEDIENER 1";0;). Diese ist immer fortlaufend, ich muss also nur vergleichen, ob der Wert der aktuellen Zeile niedriger oder höher ist als der der folgenden Zeile.
Der Text "BEDIENER 1" (darum auch meine Frage nach unbestimmten Zeichen), könnte z.B. auch "@Peter_~;." sein. Das ist zwar unwahrscheinlich, technisch aber möglich. Es können 0 bis max. 16 Zeichen sein (also auch "" ist möglich).
Bisher lese ich die CSV Datei in eine Variable ein und splitte dann jede Zeile in ein Array (CSV[1 ... n]). Aus diesem wollte ich dann die nicht benötigten Kopien einfach per [i]CSV.remove[A_Index][/i] löschen und das Array danach in eine neue Datei zurück schreiben.
Hier zur Veranschaulichung der Teil, dessen exakte Kopien nachher fehlen müssen:
[code]
04 0;0;20181227;09:41;7;0;"REG";1;"BEDIENER 1";0;1;256;"DEPT";1;"LADENVERKAUF";1;1.000;44.44;44.44;"B";0;0;0;0;0;0;0;0;0
05 0;0;20181227;09:41;7;0;"REG";1;"BEDIENER 1";0;2;256;"DEPT";1;"LADENVERKAUF";1;1.000;55.55;55.55;"B";0;0;0;0;0;0;0;0;0
06 0;0;20181227;09:41;7;0;"REG";1;"BEDIENER 1";0;3;2048;"ZWI.SUMME";0;" ";0;0.000;0.00;99.99;" ";0;0;0;0;0;0;0;0;0
07 0;0;20181227;09:41;7;0;"REG";1;"BEDIENER 1";0;4;10498;"UMSATZ 19 %";0;" ";0;0.000;0.00;99.99;" ";0;0;0;0;0;0;0;0;0
08 0;0;20181227;09:41;7;0;"REG";1;"BEDIENER 1";0;5;20738;"MWST";0;" ";0;0.000;0.00;15.96;" ";0;0;0;0;0;0;0;0;0
09 0;0;20181227;09:41;7;0;"REG";1;"BEDIENER 1";0;6;3330;"NETTO 19 %";0;" ";0;0.000;0.00;84.03;" ";0;0;0;0;0;0;0;0;0
10 0;0;20181227;09:41;7;0;"REG";1;"BEDIENER 1";0;7;4609;"BAR";0;" ";0;0.000;0.00;99.99;" ";0;0;0;0;0;0;0;0;0
[/code]
Ich möchte nicht unbedingt, dass Ihr meine [i]Arbeit[/i] macht, daher verlange ich keine fertige Routine dafür. Viel lieber möchte ich (gerade was das RegEx) angeht, Eure Vorschläge, um daraus zu lernen und vllt. endlich mal dieses Thema ein wenig zu verstehen.
Kleiner Hinweis zum Schluss:
Diese CSV Datien können 1 bis ca. 3.000.000 Zeilen haben, meist sind es um die 800.000 bis 1.000.000. Darum auch dieser Aufwand, denn solche Dateien will wirklich niemand händisch durchsuchen ;)
Vielen Dank fürs Lesen und natürlich denen, die sich noch dazu damit beschäftigen,
Gucky.