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:
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
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 454916
Url: https://administrator.de/contentid/454916
Ausgedruckt am: 21.11.2024 um 17:11 Uhr
16 Kommentare
Neuester Kommentar
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 .
Hiermit ermittelst du die Daten (Für den Einbau in eine Batchdatei):
Shellschrubber
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 .
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 ';'}}"
Tippfehler beim Übertragen. Noch mal von oben kopieren.
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.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 wasNe 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.
Tipp
Select -skip 3
Du musst nur mal das .NET kennenlernen dann kannst du auch Powershell
In Großbuchstaben übernehmen kein Problem, da reicht ein ergänztes .toUpper()...
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 ';'}}"
die aber leider nicht zur Aufgabe passt
War leider im ersten Post nicht so ganz klar was gemeint ist. 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 ';'}}"