schottenrock
Goto Top

BATCH: Werte einer Textdatei analysiern und Ergebnis ausgeben

Hallo Zusammen,

ich stehe vor einer kniffligen Herausforderung, bei der mir die Suche nicht weitergeholfen hat - oder ich habe die falschen Suchworte benutzt.

Ich habe eine Textdatei mit folgendem Inhalt aus vielen anderen Quellen generiert:

Bauteilfertigung.txt;14-217.80;-de;-en;-ru
Bauteilfertigung.txt;B147.09_1;-de;-en;-fr;-ru

Kalibrierung.txt;B130.03_4;-bg;-cs;-da;-de;-en;-es;-fi;-fr;-hu;-it;-nl;-no;-pl;-pt;-ru;-tr
Kalibrierung.txt;B130.03_2;-bg;-cs;-de;-en;-es;-fi;-fr;-hu;-it;-nl;-no;-pl;-pt;-ru
Kalibrierung.txt;B130.03_1;-bg;-cs;-de;-en;-es;-fi;-fr;-hu;-it;-nl;-no;-pl;-pt;-ru
Kalibrierung.txt;B431.08_4;-bg;-cs;-de;-en;-es;-fi;-fr;-hu;-it;-nl;-no;-pl;-pt;-ro;-ru;-sv;-tr

Im Prinzip habe ich für verschiedene Anwendungen PDF-Dateien zusammengestellt, die ich per Batch immer frisch aus dem System kopieren kann. Diese Zusammenstellungen heissen uim Beispiel Bauteilfertigung.txt und Kalibrierung.txt. Die Nummer danach, teilweise mit einem Buchstaben beginnend, sind die Namen der PDF-Dateien, die ich kopieren will. Mit einem Batchskript lese ich nun aus dem System aus, in welchen Sprachversionen die Dokumente vorhanden sind und hänge diese semikolongetrennt und alphabetisch sortiert hinten an.

Anhand des Ergebnisses möchte ich nun die Datei durcharbeiten und alle Einträge mit identischem Token 1 (Dateiname.txt) überprüfen, welche Sprachen in allen Dokumenten verfügbar sein. Also quasi den kleinsten gemeinsamen Nenner.

Eine Suche nach dem kürzesten Eintrag bringt nichts. Es könnte ja sein, dass Eintrag 1 zum Beispiel en;fr;it;es;ru;tr; hat, und der Eintrag 2 dann zum Beispiel cn;ja – dann wäre der kleinste gemeinsame Nenner nämlich 0.

Am Allerliebsten wäre mir eine Ausgabe direkt unter dem Block mit den gleichen Textdateien.

Ich sitze gerade irgendwie auf dem Schlauch. Klar gehe ich da mit einer FOR-Schleife drüber und prüfe if token 1=identisch wie vorheriger. Aber das überprüfen der Sprach-Tokens bringt mich gerade mächtig ins Grübeln. Hat jemand von Euch ne (hoffentlich gute) Idee? Darf auch gerne McGyver-Batch sein  Sollte möglichst Batch bleiben, da der Ganze Rest eines inzwischen seit langem gewachsenen und mächtigen Tool ebenfalls Batch ist.

Ich bin gespannt auf Eure Vorschläge und bedanke mich im Voraus bei Allen, die sich gedanklich mit meinem Problem auseinandersetzen.

Viele Grüße

Der Schotte mit Rock

Content-ID: 454916

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

Ausgedruckt am: 08.11.2024 um 07:11 Uhr

139920
Lösung 139920 23.05.2019 aktualisiert um 13:16:01 Uhr
Goto Top
No Problem,
wieso man dann aber die Sprachen ebenfalls mit Semikolon getrennt anhängt ist schon etwas "komisch". Delimiter sollte man so verwenden wofür sie vorgesehen sind nämlich zum Trennen von unterschiedlichen Spalten nicht von Arrays des gleichen Typs, einfacher wäre gewesen die Sprachen dann stattdessen mit Komma zu trennen dann wäre es auch mit CSV-Import wesentlich konsistenter handlebar.

Naja, wohl noch nicht so viel Erfahrung in solchen Sachen gelle face-wink.

Hiermit ermittelst du die Daten (Für den Einbau in eine Batchdatei):
@echo off
set "file=D:\datei.txt"  
powershell -EP ByPass -NoP -C "Get-Content '%file%' | ?{$_ -notmatch '^\s*$'} | group {$_.split(';')} | select Name, @{n='Gemeinsame Sprachen';e={$grp = $_.Group;($grp | %%{$_.split(';',3)[2].split(';')} | group | ?{$_.count -eq $grp.Count} | %%{$_.Group}) -join ';'}}"  
Shellschrubber
Schottenrock
Schottenrock 23.05.2019 um 12:28:48 Uhr
Goto Top
Hallo Shellschrubber,

danke für Deinen Beitrag. Ich habe das gerade mal eingebaut. Mit powershell kenne ich mich gar nicht aus, bin eher Hobby-Batcher. face-smile

Aber um auf Deine Frage Kommy <> Semikolon zu antworten: ja, keine Erfahrung passt am Ehesten. Ich jann aber ohne Probleme meine Abfrage überarbeiten und die Datei so aufbauen:

Zusammenstellung.txt;B123.45_6;-de,-en,-tr

Dann wären die Sprachen alle in einem Token mit Komma getrennt.

Ansonten läuft bei dem Skript ein Fehler auf:

FILE:C:\Users\mg\Desktop\PDF-Dateien\ZUS_LNG-Check_SP.txt
In Zeile:1 Zeichen:112
+ ... roup {$_.split(;)} | select Name, @{n='Gemeinsame Sprachen';e={($_.Group | {$ ...  
+                    ~
")" fehlt in einem Methodenaufruf.  
In Zeile:1 Zeichen:102
+ ... \s*$'} | group {$_.split(;)} | select Name, @{n='Gemeinsame Sprachen';e={($_. ...  
+                    ~
Schließende "}" fehlt im Anweisungsblock.  
In Zeile:1 Zeichen:113
+ ... oup {$_.split(;)} | select Name, @{n='Gemeinsame Sprachen';e={($_.Group | {$_ ...  
+                    ~
Unerwartetes Token ")" in Ausdruck oder Anweisung.  
In Zeile:1 Zeichen:115
+ ... p {$_.split(;)} | select Name, @{n='Gemeinsame Sprachen';e={($_.Group | {$_.G ...  
+                    ~
Der Typname nach "[" fehlt.  
In Zeile:1 Zeichen:117
+ ... {$_.split(;)[0]} | select Name, @{n='Gemeinsame Sprachen';e={($_.Group | {$_.Gro ...  
+                    ~
Unerwartetes Token "}" in Ausdruck oder Anweisung.  
In Zeile:1 Zeichen:119
+ ... _.split(;)} | select Name, @{n='Gemeinsame Sprachen';e={($_.Group | {$_.Group ...  
+                    ~
Ein leeres Pipeelement ist nicht zulässig.
In Zeile:1 Zeichen:175
+ ... e={($_.Group | {$_.Group}) -join ';'}}  
+                    ~~~~~~~~~~~~~
Ausdrücke sind nur als erstes Element einer Pipeline zulässig.
    + CategoryInfo          : ParserError: (:) , ParentContainsErrorRecordException
    + FullyQualifiedErrorId : MissingEndParenthesisInMethodCall

Wie gesagt, ich kenne mich nicht aus und hatte auf eine McGyver-Batch Lösung gehofft. Aber vielleicht helfen Dir die Fehlermeldungen.
139920
139920 23.05.2019 aktualisiert um 12:42:53 Uhr
Goto Top
Tippfehler beim Übertragen. Noch mal von oben kopieren.
Schottenrock
Schottenrock 23.05.2019 um 13:06:11 Uhr
Goto Top
Sieht schon besser aus, aber das Ergebnis stimmt noch nicht.

Hier mal der Inhalt einer (sehr kleinen) datei.txt

Bauteilfertigung.txt;B147.06_1;-de;-en;-es;-fr;-pt;-ru
Bauteilfertigung.txt;14-218.Z01;-de;-en;-es;-fi;-fr;-nl;-ru
Bauteilfertigung.txt;14-217.61Bl.1;-de;-en;-es;-fi;-fr;-nl;-ru
Bauteilfertigung.txt;B147.30_4;-de;-en;-ru
Bauteilfertigung.txt;B147.20_1;-de;-en;-ru
Bauteilfertigung.txt;14-232.13;-de;-en;-ru
Bauteilfertigung.txt;14-232.12;-de;-en;-ru
Bauteilfertigung.txt;14-217.81;-de;-en;-ru
Bauteilfertigung.txt;14-217.80;-de;-en;-ru
Bauteilfertigung.txt;B147.09_1;-de;-en;-fr;-ru
Bauteilfertigung.txt;14-214.45C;-de;-en;-ru
 
Kalibrierung.txt;B130.03_12;-de;-en;-es;-fr;-hu;-it;-nl;-pt;-ru
Kalibrierung.txt;B301.08_1;-bg;-de;-en;-es;-fi;-fr;-hu;-nl;-pl;-pt;-ru
Kalibrierung.txt;B301.04_1;-de;-en;-es;-fr;-it;-nl;-pt
Kalibrierung.txt;B130.03_4;-bg;-cs;-da;-de;-en;-es;-fi;-fr;-hu;-it;-nl;-no;-pl;-pt;-ru;-tr
Kalibrierung.txt;B130.03_2;-bg;-cs;-de;-en;-es;-fi;-fr;-hu;-it;-nl;-no;-pl;-pt;-ru
Kalibrierung.txt;B130.03_1;-bg;-cs;-de;-en;-es;-fi;-fr;-hu;-it;-nl;-no;-pl;-pt;-ru
Kalibrierung.txt;B431.08_4;-bg;-cs;-de;-en;-es;-fi;-fr;-hu;-it;-nl;-no;-pl;-pt;-ro;-ru;-sv;-tr
Kalibrierung.txt;B130.03_13;-de;-en;-es;-fr;-hu;-it;-nl;-pt;-ru
Kalibrierung.txt;B130.03_11;-cs;-de;-en;-es;-fi;-fr;-it;-nl;-pt;-ru
Kalibrierung.txt;B130.03_9;-cs;-de;-en;-es;-fi;-fr;-it;-nl;-pt;-ru
Kalibrierung.txt;B501.09_2;-cs;-de;-en;-es;-fi;-fr;-nl;-pt;-ru
Kalibrierung.txt;10-930Bl.2;-de;-en;-es;-fr;-it;-pt;-ru
Kalibrierung.txt;10-810Bl.05;-de;-en;-es;-fr;-hu;-it;-nl;-pl;-pt;-ru
Kalibrierung.txt;10-790Bl.08;-de;-en;-es;-fr;-hu;-it;-nl;-ru
Kalibrierung.txt;74-003Bl.02;-cs;-de;-en;-es;-fi;-fr;-hu;-it;-nl;-no;-pl;-pt;-ru
Kalibrierung.txt;B141.19_1;-cs;-de;-en;-es;-fr;-it;-nl;-pl;-pt;-ru
Kalibrierung.txt;B141.05_1;-de;-en;-es;-fr;-it;-nl;-pt;-ru
Kalibrierung.txt;B141.40_1;-de;-en;-es;-fr;-it;-nl;-ru
Kalibrierung.txt;B141.07_1;-cs;-de;-en;-es;-fr;-it;-nl;-pl;-ru
Kalibrierung.txt;B141.30_1;-de;-en;-es;-fr;-it;-nl;-pl;-pt;-ru
Kalibrierung.txt;B141.13_1;-de;-en;-es;-fr;-nl;-ru
Kalibrierung.txt;B143.03_1;-cs;-de;-en;-es;-fr;-hu;-it;-nl;-pl;-pt;-ru
Kalibrierung.txt;B130.03_20;-de;-en;-ru
Kalibrierung.txt;B130.03_22;-de;-en;-ru
Kalibrierung.txt;B130.03_23;-de;-en;-ru

Das Ergebnis hierzu lautet aber:
Name                                                                  Gemeinsame Sprachen
----                                                                  -------------------
Bauteilfertigung.txt                                                  -de;-en;-es;-fr;-ru;-fi;-nl
Kalibrierung.txt                                                      -de;-en;-es;-fr;-hu;-it;-nl;-pt;-ru;-bg;-fi;-pl;-cs;-no;-tr

Es sind weder alle Sprachen, was ich zuerst vermutet hatte noch der kleinste gemeinsame Nenner.

Vielen Dank, dass Du mir hilfst. Bzw. hier meine ganze Arbeit erledigst. Dürfte ich Dich um eine kleine Erläuterung bitten, wenn wir am Ende alles am Laufen haben, dass ich das dann auch verstehe, was ich hier kopiere?

Viele Grüße

Der Schotte im Rock
139920
Lösung 139920 23.05.2019 aktualisiert um 13:18:37 Uhr
Goto Top
Da hatte ich was missverstanden, Anpassung s. oben.
Dürfte ich Dich um eine kleine Erläuterung bitten, wenn wir am Ende alles am Laufen haben, dass ich das dann auch verstehe, was ich hier kopiere?
Das Skript gruppiert die Zeilen nach Dateinamen, dann wird für jede Gruppe der Name der Datei übernommen und in einer calculated property werden die Sprachen in ein Array aufgeteilt welches wiederum gruppiert wird und nur die Sprachen die bei allen Einträgen des Dateinamens vorkommen werden ausgegeben und dann mit Komma voneinander getrennt in einen String geschrieben.
Schottenrock
Schottenrock 23.05.2019 um 13:26:12 Uhr
Goto Top
Super es funktioniert tadellos. Herzlichen Dank!

Wie gebe ich das Ergebnis nun aber in eine Datei aus? >>datei_sprache.txt (zum Beispiel).

Viele Grüße

Der Schotte im Rock
Schottenrock
Schottenrock 23.05.2019 um 13:51:40 Uhr
Goto Top
Mitdenken hilft!

Die Lösung habe ich selber geschrieben [kopfschüttel]
Wir starten den String ja aus Batch heraus, dann kann ich die Ausgabe auch ganz einfach in eine Datei umlenken. Einfach am Ende des Skripts nach }) -join ';'}}" noch <datei.txt anfügen (ggf. mit Pfad).

Nochmal herzlichen Dank an Shellschrubber!
Schottenrock
Schottenrock 23.05.2019 um 14:04:31 Uhr
Goto Top
Ne Mini-Challenge hätte ich noch...

Also ich bin bis jetzt echt mehr als zufrieden und es klappt alles supertoll. Aber könnte man das Einlesen erst ab Zeile 3 beginnen? Bzw. noch besser: Alles überspringen, was nur 1 Token hat, sprich Überschriften? Ich habe nä,lich Zwischenüberschriften rausgeschmissen, weil es dann "maschinenlesbarer" wird, aber fürs Auge ist es schöner, wenn es strukturierter aussieht. Aber falls das nicht ganz einfach geht lass es, ich habe jetzt schon mehr, als ich erwarten durfte.
139920
Lösung 139920 23.05.2019 aktualisiert um 14:12:08 Uhr
Goto Top
Zitat von @Schottenrock:

Ne Mini-Challenge hätte ich noch...

Also ich bin bis jetzt echt mehr als zufrieden und es klappt alles supertoll. Aber könnte man das Einlesen erst ab Zeile 3 beginnen? Bzw. noch besser: Alles überspringen, was nur 1 Token hat, sprich Überschriften? Ich habe nä,lich Zwischenüberschriften rausgeschmissen, weil es dann "maschinenlesbarer" wird, aber fürs Auge ist es schöner, wenn es strukturierter aussieht. Aber falls das nicht ganz einfach geht lass es, ich habe jetzt schon mehr, als ich erwarten durfte.
Du machst je gerne selbst was
Tipp
Select -skip 3
https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell. ... face-wink
Schottenrock
Schottenrock 23.05.2019 um 14:13:56 Uhr
Goto Top
Super, so gefällt mir das. Mache mich gegen später dran, bin gerade im Tagesgeschäft gefangen. Melde mich wieder. Und Deine RTFM-Initiative kann ich nur unterstützen! Hoffentlich habe ich den Hals jetzt nicht zu voll genommen ...
Schottenrock
Schottenrock 23.05.2019 um 17:46:29 Uhr
Goto Top
Sogar mit Link zum Manual. Danke.

| Select-Object -skip 3
nach dem Get-Content Befehl einfügen und es klappt.

So macht es echt Spass. Danke, das sich (wenigstens ein klitzekleines bisschen) mitarbeiten durfte!

Es grüßt Dich dankend
Der Schotte im Rock
Schottenrock
Schottenrock 31.05.2019 um 10:04:54 Uhr
Goto Top
Guten Morgen,

ich habe mir da jetzt noch was eingebaut und meine Daten, die ich nun mit dem PS-Script bearbeiten muss:

Kalibrierung.txt;B130.03_20;-de;-en;-ru
Kalibrierung.txt;B130.03_22;-de;-EN;-ru
Kalibrierung.txt;B130.03_23;-de;-en;-ru

Im mittleren Datensatz ist zum Beispiel EN in Großbuchstaben. Beim generieren dern Daten überprüfe ich nun, ob die Übersetzungsdatei neuer ist als die deutsche Datei, weil dann hat es ja Änderungen in de gegeben, die noch nicht übersetzt sind. Manchmal wird auch nur ein Rechtschreibfehler korrigiert, aber eine zu alte Übersetzung birg Fehlerpotential.

Weisst Du (oder sonst wer) einen Tipp, wie ich Groß- und Kleinschreibung erkennen kann und dann, falls beides Varianten da sind, die Großschreibung übernehmen kann?

Ganz ehrlich der powershell Syntax ist meilenweit entfernt von dem, was ich als Batch gewohnt bin. Da komme ich nicht mal mit try & error weiter...
139920
139920 31.05.2019 aktualisiert um 10:26:26 Uhr
Goto Top
Du musst nur mal das .NET kennenlernen dann kannst du auch Powershell face-wink

In Großbuchstaben übernehmen kein Problem, da reicht ein ergänztes .toUpper()...
@echo off
set "file=D:\datei.txt"  
powershell -EP ByPass -NoP -C "Get-Content '%file%' | ?{$_ -notmatch '^\s*$'} | group {$_.split(';')} | select Name, @{n='Gemeinsame Sprachen';e={$grp = $_.Group;($grp | %%{$_.split(';',3)[2].split(';')} | group | ?{$_.count -eq $grp.Count} | %%{$_.Group.toUpper()}) -join ';'}}"  
Schottenrock
Schottenrock 31.05.2019 um 10:41:03 Uhr
Goto Top
Danke shellschrubber,

ja, vielleicht sollte ich mich mal mit .NET beschäftigen. Aber irgendwann ist man in einem Alter, wo man denkt, mir reicht Batch noch aus face-smile Mir fehlt eigentlich auch die Zeit, mich mit weiteren Sprache zu beschäftigen. Ich muss gerade nebenher für meinen Sohn ein Homeprojekt umsetzen und arbeite mich durch Python...

Nun ja, danke, dass Du mir hier eine Lösung präsentiert hast, die aber leider nicht zur Aufgabe passt face-sad

Ich möcht enicht, dass Alles groß geschrieben wird. Sondern wenn ein wert in Groß- und Kleinschriebung in mehrern Datensätzen vorkommt, dann soll großgeschrieben werden.

Hättest Du mir freundlicherweise hierbei auch einen Ansatz?

Viele Grüße

der Schotte im Rock
139920
Lösung 139920 31.05.2019 aktualisiert um 10:50:29 Uhr
Goto Top
die aber leider nicht zur Aufgabe passt face-sad
War leider im ersten Post nicht so ganz klar was gemeint ist. face-sad
Auch kein Beinbruch.
@echo off
set "file=D:\datei.txt"  
powershell -EP ByPass -NoP -C "Get-Content '%file%' | ?{$_ -notmatch '^\s*$'} | group {$_.split(';')} | select Name, @{n='Gemeinsame Sprachen';e={$grp = $_.Group;($grp | %%{$_.split(';',3)[2].split(';')} | group | ?{$_.count -eq $grp.Count} | %%{$_.Group | sort -CaseSensitive -Descending | select -first 1}) -join ';'}}"  
Schottenrock
Schottenrock 31.05.2019 um 12:33:27 Uhr
Goto Top
Habe mir gerade nochmal meine Frage durchgelesen und muss Dir recht geben, man kann es auch anders verstehen. Da war ich wohl zu sehr in meinem Element face-smile

Wie nicht anders zu erwarten klappt Dein Skript und gibt mir das, was ich will. Herzlichen Dank für Deine Unterstützung.