berni3487
Goto Top

Batch datei ausfiltern

Ich möchte eine Textdatei die von einen Programm exportiert wird speziell filtern, und die gefundenen werte in excel anzeigen.

Hallo

Einfache copy befehle o.ä. bekomme ich per batch hin, aber bei folgender Aufgabenstellung muss ich leider passen.
Vielleicht könnt ihr mir da bitte weiterhelfen!

Also die Datei sieht wie folgt aus:

0,0,1,1;10,1;21,Z;22,27.07.10;23,23:00:00;24,O;25,0;27,3;51,0;11,testkasse;12,100;18,1;19,192.168.2.10;2,16.08.2010;3,13:57;4,34;5,VCOM 6.94;6,T7.0.2.0-112;8,16;1001,1;1101,50/EUR;1201,1
2,1,1,CC:54/189/50
2,1,16,CC:2/7/50
2,1,911,CC:2/-7/50
2,2,1,CC:106/359.3/50
2,2,16,CC:2/7.5/50
2,2,911,CC:2/-7.5/50
2,3,1,CC:22/146.5/50
2,3,16,CC:1/50/50
2,3,911,CC:1/-50/50
2,4,1,CC:26/86.4/50
2,5,1,CC:264/626.1/50
2,5,16,CC:2/3.3/50
2,5,911,CC:2/-3.3/50
2,6,1,CC:1296/4642.9/50
2,6,16,CC:53/213.7/50
2,6,911,CC:53/-213.7/50
2,7,1,CC:775/2110.7/50
2,7,16,CC:446/1461.8/50
2,7,911,CC:446/-1461.8/50
2,8,1,CC:102/468.6/50
2,8,16,CC:5/12.9/50
2,8,911,CC:5/-12.9/50
2,9,1,CC:6/3960.6/50
2,9,16,CC:6/328.5/50
2,9,911,CC:6/-328.5/50
2,10,1,CC:201/674.5/50
2,11,1,CC:139/454.2/50
2,11,16,CC:1/4.1/50
2,11,911,CC:1/-4.1/50
2,15,1,CA:3952/0
2,15,16,CA:168/0
2,15,911,CA:168/0
0,0,1,1;10,1;21,Z;22,28.07.10;23,00:07:00;24,O;25,0;27,3;51,0;11,testkasse;12,100;18,1;19,192.168.2.10;2,16.08.2010;3,13:57;4,34;5,VCOM 6.94;6,T7.0.2.0-112;8,16
2,7,1,CC:113/384.2/50

Das ist ein Warengruppenbericht einer Registrierkasse

Die ersten 2 Zeilen ist die Header Info der jeweiligen Kasse

Wenn ich mir genau die dritte Zeile anschaue:

2,1,1,CC:54/189/50

Das 1,1 bedeuted das dass die erste Warengruppe mit den Endbetrag von 189€ gebucht worden ist
dann folgenden 2 Zeilen sind Storno Infos die keiner benötigt...

dann gehts weiter mit

2,2,1,CC:106/359.3/50

Das wäre jetzt also die 2te Warengruppe mit den Wert von 359.30

usw.

die Excel Datei sollte dann oder auch eine weitere Textdatei das ist egal...
sollte dann so aussehen

1;189
2;359.3
...


noch eine kleine besonderheit wo ich überhaupt nicht weiss wie mann das löst ist,
wie mann im Beispiel sieht das z.B. die Warengruppe 12 / 13 /14 nicht gebucht wurde!


das aber z.B am nächsten Tag der Fall sein könnte.


Ich hoffe ich konnte das ganze halbweg verständlich rüberbringen und hoffe ihr könnt mir dabei helfen

besten Dank im Voraus

Content-Key: 149109

Url: https://administrator.de/contentid/149109

Printed on: April 26, 2024 at 02:04 o'clock

Member: bastla
bastla Aug 16, 2010 at 16:41:17 (UTC)
Goto Top
Hallo berni3487 und willkommen im Forum!

Im einfachsten Fall wäre das eine Zeile (zum Testen direkt in der CMD-Shell, Daten werden aus der Datei "Kasse.txt" gelesen):
for /f "tokens=2,5 delims=,/" %i in ('findstr /v "testkasse" "Kasse.txt"') do @echo %i;%j
Eine CSV-Datei wird daraus, wenn am Ende noch zB ">>Kasse.csv" angefügt wird.

In dieser Minimalvariante werden einfach die jeweiligen Tages-Header (besteht allerdings lt Deinem Beispiel nur aus 1 Zeile) herausgefiltert (wie anderenfalls damit umgegangen werden sollte, hast Du noch nicht erklärt) und die beiden relevanten Felder Nr 2 und 5 ausgegeben ...

Grüße
bastla
Member: Biber
Biber Aug 16, 2010 at 16:58:34 (UTC)
Goto Top
Moin bernie3487,

ausgesuchte Teile deines Konzepts sind völlig einleuchtend und fast schon selbsterklärend.

Aber zu kleineren Nebenschauplätzen habe ich Nachfragen.

aber bei folgender Aufgabenstellung muss ich leider passen.
Was genau meinst du mit "Aufgabenstellung"?

Ist denn wirklich der große Plan, dass du jeden Tag wieder eine Detailbuchungen-Datei auf ein paar spärliche Summenzeilen zusammendampfst und dafür jeden Tag wieder eine neue Text/Csv/Excel-datei erzeugst?

Wenn ja... hat der Input ( bei dir vorsichtig mit "die Datei" umschrieben) eine Namenskonvention, z.B. die heissen Immer "FromSaschaWithLove.txt" oder Umsatz20100816.csv"?

Sollen neu erzeugte Dateien auch irgendwie heissen oder soll ein Zufallswert als Vorname dienen? (Wenn Zufallswert: reicht es 5stellig oder sind 128 Stellen sinnvoller?)

Oder soll alles (bzw. alles pro Woche, alles pro Monat,...) in EINE Excel-Tabelle und jeweils in eine Spalte?

Was soll dann weiter mit den Daten passieren - gehen die paar Umsatz-Ergebniszahlen direkt bei der Cheffin aufs iPhone oder liegen die erstmal einfach so da?

WoherTF soll irgendwer/irgendwas "wissen" oder "erkennen", für welche Warengruppen heute keine Buchungen da sind, aber morgen vielleicht?
Vielleicht wird ja Artikelgruppe Fisch nur Donnerstags & Freitags verkauft und Weihnachtsbäume fast das ganze Jahr nicht... aber Ende des Jahres wie doll.

Wissen selbst die 5 Wirtschaftsweisen nicht so genau - wie soll ein mickriger Batch das vorausahnen?

Bitte tritt erst noch mal einen Schritt zurück, bevor wir uns mit der Uhrmacherlupe über einzelne Token-Zerlegungen beugen und skizzier mal den Prozess.

["Die Daten fallen unerwartet jeden Tag außer Sonntag ind das Verzeichnis XZ, haben den Namen ...bla... und am Ende der Reise sollen die Tages-/Wochen-/Monatsdaten..weitergehen an ...ABC... .., weil damit ...sülzdibülz... getätigt werden muss..."]

Grüße
Biber
Member: berni3487
berni3487 Aug 16, 2010 at 17:41:35 (UTC)
Goto Top
Sorry ich versuch nochmal von Vorne:

Die Kasse wird täglich von einen speziellen Programm ausgelesen und die Warengruppenumsätze gespeichert.
Am Ende jeden Monats wird dann die gepostete Textdatei erstellt d.h das ganze wird monatlich gemacht!

Diese Textdatei hatt immer dieslebe Bezeichnung.

Der Name der neu erzeugten datei ist egal

Ergebnis sollte eine CSV Datei oder Excel Tabelle sein die die oben gewünschten Werte ausgibt, Spalte A Warengruppenummer Spalte B den Wert oder für CSV 1;189.

Diese Datei soll am PC irgendwo gespeichert werden!

Das mit den Vorausahnen :
Wenn z.B.: 13,1 nicht in der Export datei, dann eine Null ausgeben...
Member: berni3487
berni3487 Aug 16, 2010 at 18:16:37 (UTC)
Goto Top
Zitat von @bastla:
Hallo berni3487 und willkommen im Forum!>
In dieser Minimalvariante werden einfach die jeweiligen Tages-Header (besteht allerdings lt Deinem Beispiel nur aus 1 Zeile)
herausgefiltert (wie anderenfalls damit umgegangen werden sollte, hast Du noch nicht erklärt) und die beiden relevanten
Felder Nr 2 und 5 ausgegeben ...

ja aber leider auch die nicht benötigten Zwischenzeilen,

(2,1,1,CC:54/189/50 danach kommt ja immer 1,16 und 1,911, 2;16 und 2;911...)

diese sollten nicht mitausgegeben werden

wenn das so erstmal funktioniert wäre das schon echt super!
Member: bastla
bastla Aug 16, 2010 at 18:21:31 (UTC)
Goto Top
Hallo berni3487!

Dann erweitere die "Ausschlüsse" doch einfach:
for /f "tokens=2,5 delims=,/" %i in ('findstr /v ",16, ,911, testkasse" "Kasse.txt"') do @echo %i;%j
Grüße
bastla
Member: berni3487
berni3487 Aug 16, 2010 at 20:15:24 (UTC)
Goto Top
Hab das ganze getestet echt perfekt genau so wie ich es haben wollte

Ich muss jedoch nochmal aus interesse fragen:

Normalerweise kommuliert das Programm die Einzelnen Tage hin und wieder kommt es aber dazu das die Lesung pro Tag in der TXT Datei stehen
ich müsste also alle Warengruppen nochmals addieren den laut unserer Testdatei Hab ich folgendes Ergebnis:

1;189
2;359.3
3;146.5
4;86.4
5;626.1
6;4642.9
7;2110.7 --> !!!
8;468.6
9;3960.6
10;674.5
11;454.2
15;0
7;384.2 -->!!!

Und könnten wir mehrere Kassen auch ausfiltern? und jeweils eine csv daraus machen? (Kasse1.csv, Kasse2.csv)
Denn im Header stett ja die Info der Kasse

ein Beispieldatei wäre wie folgt:

0,0,1,1;10,1;21,Z;22,27.07.10;23,23:00:00;24,O;25,0;27,3;51,1;11,Kasse1;12,100;18,1;19,192.168.2.10;2,16.08.2010;3,22:11;4,34;5,VCOM 6.94;6,T7.0.2.0-112;8,16;1001,1;1101,50/EUR;1201,1
2,1,1,CC:54/189/50
2,1,16,CC:2/7/50
2,1,911,CC:2/-7/50
2,2,1,CC:106/359.3/50
2,2,16,CC:2/7.5/50
2,2,911,CC:2/-7.5/50
2,3,1,CC:22/146.5/50
2,3,16,CC:1/50/50
2,3,911,CC:1/-50/50
2,4,1,CC:26/86.4/50
2,5,1,CC:264/626.1/50
2,5,16,CC:2/3.3/50
2,5,911,CC:2/-3.3/50
2,6,1,CC:1296/4642.9/50
2,6,16,CC:53/213.7/50
2,6,911,CC:53/-213.7/50
2,7,1,CC:775/2110.7/50
2,7,16,CC:446/1461.8/50
2,7,911,CC:446/-1461.8/50
2,8,1,CC:102/468.6/50
2,8,16,CC:5/12.9/50
2,8,911,CC:5/-12.9/50
2,9,1,CC:6/3960.6/50
2,9,16,CC:6/328.5/50
2,9,911,CC:6/-328.5/50
2,10,1,CC:201/674.5/50
2,11,1,CC:139/454.2/50
2,11,16,CC:1/4.1/50
2,11,911,CC:1/-4.1/50
2,15,1,CA:3952/0
2,15,16,CA:168/0
2,15,911,CA:168/0
0,0,1,1;10,2;21,Z;22,27.07.10;23,23:00:00;24,O;25,0;27,2;51,1;11,Kasse2;18,2;19,.;2,16.08.2010;3,22:11;4,34;5,VCOM 6.94;6,T7.0.2.0-112;8,16;1001,1;1101,50/EUR;1201,1
2,1,1,CC:37/129.5/50
2,1,16,CC:1/3.5/50
2,1,911,CC:1/-3.5/50
2,2,1,CC:26/102.6/50
2,3,1,CC:5/34.4/50
2,4,1,CC:3/9.1/50
2,5,1,CC:172/459.4/50
2,6,1,CC:448/1590.8/50
2,6,16,CC:3/13.2/50
2,6,911,CC:3/-13.2/50
2,7,1,CC:105/214.2/50
2,7,16,CC:2/6.8/50
2,7,911,CC:2/-6.8/50
2,8,1,CC:55/249.4/50
2,8,16,CC:1/4.6/50
2,8,911,CC:1/-4.6/50
2,9,1,CC:2/515.3/50
2,10,1,CC:50/165/50
2,11,1,CC:39/123.3/50
2,15,1,CA:1200/0
2,15,16,CA:11/0
2,15,911,CA:11/0

Wenn ich das noch hinbekommen würde.... face-smile
Member: bastla
bastla Aug 16, 2010 at 21:01:29 (UTC)
Goto Top
Hallo berni3487!
ich müsste also alle Warengruppen nochmals addieren
Das müsstest Du doch in Excel hinbekommen - Stichwort "SUMMEWENN()" (Rechnen mit Dezimalzahlen ist keine echte Stärke von Batch) ...
Und könnten wir mehrere Kassen auch ausfiltern?
Und wäre es nicht sinnvoller, vorweg schon zu verhindern, dass die Daten aller Kassen in einer einzigen Datei landen?

Falls Du Dich auf die Struktur der Textdatei wie oben dargestellt verlassen kannst, dann etwa so:
@echo off & setlocal
pushd "D:\Kassendaten"  
set "Ein=Kasse.txt"  

del *.csv 2>nul
set "Aus="  
for /f "tokens=2,5,22 delims=,;/" %%i in ('findstr /v ",16, ,911," "%Ein%"') do if "%%k" neq "" (set "Aus=%%k.csv") else (call :ProcessLine "%%i" "%%j")  
popd
goto :eof

:ProcessLine
>>"%Aus%" echo %~1;%~2  
goto :eof
Ich habe unterstellt, dass Ausgangsdatei und Ergebnisse im Ordner "D:\Kassendaten" gespeichert sind/werden sollen, und dass es in diesem Ordner keine erhaltenswerten ".csv"-Dateien gibt (und daher vorweg alle ev noch vom vorigen Monat vorhandenen Dateien gelöscht werden können).

Grüße
bastla
Member: berni3487
berni3487 Aug 17, 2010 at 08:47:47 (UTC)
Goto Top
Habe das ganze getestet.
Ich muss noch jetzt ein bisserl mit Excel basteln dann ist es Perfekt!

Vielen Vielen Dank!