Textdateien inhaltlich vergleichen
Tach zusammen,
Folgendes Problem:
Ich habe zwei Dateien eines Rechenlaufes, von welchen eine die Werte aller Rechenzeitschritte enthält, die andere nur die Maximalwerte. Die Dateien sehen dabei wie folgt aus:
Die Datei mit den Einzelwerten (WSPL.dat):
"ND" steht dabei für die Anzahl der Rechennetzknoten (Nodes) und damit die Anzahl der Zeilen je Zeitschritt,
"TS" für den aktuellen Zeitschritt (Time Step) in Sekunden. Die Nachkommastellen bei der Zeit sind für mich uninteressant.
Ein "End-Tag" je Zeitschritt ist nicht vorhanden.
Die Datei mit den Maximalwerten (WSPL_max.dat):
Hier ist "TS" der letzte gerechnete Zeitschritt.
Ich möchte nun eine Datei, in der der Zeitschritt steht, in dem das Maximum erreicht wird. z.B. so (Diese ist jetzt nur gebastelt!):
Zum Thema Robustheit / Datenvolumen:
Die vorherigen Daten stammen aus einem überschaubaren Rechennetz. Die Anzahl der Knoten (ND) liegt z.Z. um die 1,2 Mio. bei 50 Zeitschritten und mehr. Das macht ca 13 MB für die WSPL_max.dat und z.B. 640 MB für die WLSP.dat. Für diese Groß-Projekte darf die Aufbereitung auch ein paar Stündchen dauern.
Meine Idee wäre, die WSPL.dat in einzelne Datei-"Scheibchen" je Zeitschritt zu teilen (z.B. per FOR-Schleife) und dann z.B. per FC die Scheibchen mit der Maximaldatei zu vergleichen. Irgendwo hatte ich hier im Forum auch schon ein VB-Script für Berechnungen mit Nachkommastelle gefunden.
Bevor ich jetzt drauf los klimpere und einen Haufen Zeit wegen unausgereifter Batch- / VB-Kenntnisse vertrödle, wollte ich Euch um Kommentierung bzw. Alternativvorschläge bitten.
Danke, Gisi
Folgendes Problem:
Ich habe zwei Dateien eines Rechenlaufes, von welchen eine die Werte aller Rechenzeitschritte enthält, die andere nur die Maximalwerte. Die Dateien sehen dabei wie folgt aus:
Die Datei mit den Einzelwerten (WSPL.dat):
SCALAR
ND 21516
ST 0
TS 10.00
0.0000
0.0000
0.0000
0.0000
0.0000
0.0000
...
SCALAR
ND 21516
ST 0
TS 14400.41
0.0000
115.8919
115.8919
115.8900
115.8861
115.8864
...
SCALAR
ND 21516
ST 0
TS 28800.33
0.0000
116.2450
116.2450
116.2397
116.2361
116.2369
...
usw.
"TS" für den aktuellen Zeitschritt (Time Step) in Sekunden. Die Nachkommastellen bei der Zeit sind für mich uninteressant.
Ein "End-Tag" je Zeitschritt ist nicht vorhanden.
Die Datei mit den Maximalwerten (WSPL_max.dat):
SCALAR
ND 21516
ST 0
TS 43200.19
0.0000
116.4927
116.4927
116.4711
116.4741
116.4742
...
Ich möchte nun eine Datei, in der der Zeitschritt steht, in dem das Maximum erreicht wird. z.B. so (Diese ist jetzt nur gebastelt!):
SCALAR
ND 21516
ST 0
TS 43200.19
0.0000
3600
7200
14400
28800
7200
...
Zum Thema Robustheit / Datenvolumen:
Die vorherigen Daten stammen aus einem überschaubaren Rechennetz. Die Anzahl der Knoten (ND) liegt z.Z. um die 1,2 Mio. bei 50 Zeitschritten und mehr. Das macht ca 13 MB für die WSPL_max.dat und z.B. 640 MB für die WLSP.dat. Für diese Groß-Projekte darf die Aufbereitung auch ein paar Stündchen dauern.
Meine Idee wäre, die WSPL.dat in einzelne Datei-"Scheibchen" je Zeitschritt zu teilen (z.B. per FOR-Schleife) und dann z.B. per FC die Scheibchen mit der Maximaldatei zu vergleichen. Irgendwo hatte ich hier im Forum auch schon ein VB-Script für Berechnungen mit Nachkommastelle gefunden.
Bevor ich jetzt drauf los klimpere und einen Haufen Zeit wegen unausgereifter Batch- / VB-Kenntnisse vertrödle, wollte ich Euch um Kommentierung bzw. Alternativvorschläge bitten.
Danke, Gisi
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 111195
Url: https://administrator.de/contentid/111195
Ausgedruckt am: 16.11.2024 um 15:11 Uhr
2 Kommentare
Neuester Kommentar
Moin ghoyer,
ich würde eine etwas Strategie vorschlagen...
Dein Lösungsansatz würde ja auch zum Ziel führen, hat aber irgendwie den immer deprimierend wirkenden Anstrich von stundenlangem stupiden Sandschaufeln.
So was schlägt mir immer aufs Gemüt.
Wenn ich die Anforderung richtig verstanden habe, dann willst Du doch nur den Max-Wert der Zeilen "TS nnnnn.mm" ermitteln und genau diesen vollständigen Block rausziehen.
Also wäre meine Idee
Schritt 1 & 2 lassen sich mit einer CMD-Promptzeile abfackeln, wie ich an einer um 2 Blöcke erweiterten wspl.dat demonstrieren möchte:
Darauf schiesse ich diese Zeile ab vom CMD-Prompt:
[ohne ">".... das ">" ist mein Prompt-Zeichen.... NICHT mit eingeben!]
... und erhalte (as should do) folgende Ausgabe:
---> d.h. mit dieser einen Zeile habe ich den TS-maxWert 28000 ermittelt und weiss, dass der in Zeile 26 Steht
Wenn ich dann noch "weiss", dass zwei Zeilen davor der NodeName steht und in den 5 Zeilen danach die Detailwerte, dann kann ich diese Zeilen gezielt herausfieseln.
Nun muss ich nur noch die Zeilen-Nummern wieder entsorgen:
Dann habe ich den Block, den Du wolltest.
Oder habe ich es falsch verstanden?
Grüße
Biber
ich würde eine etwas Strategie vorschlagen...
Dein Lösungsansatz würde ja auch zum Ziel führen, hat aber irgendwie den immer deprimierend wirkenden Anstrich von stundenlangem stupiden Sandschaufeln.
So was schlägt mir immer aufs Gemüt.
Wenn ich die Anforderung richtig verstanden habe, dann willst Du doch nur den Max-Wert der Zeilen "TS nnnnn.mm" ermitteln und genau diesen vollständigen Block rausziehen.
Also wäre meine Idee
- den Max-Wert (neudeutsch maxvalue, im folgenden als Variable %mv% auftauchend) der "TimeStep"-Zeilen ermitteln
- von dieser Zeile mit dem maxWert merken wir uns die Zeilen-Nummer (nenn ich mal %mvl% wie maxValueLine.
- und holen uns aus dem ganzen Riesen-Textgeraffel der wspl.dat diese Zeile+ein paar Zeilen plusminus aus.
Schritt 1 & 2 lassen sich mit einer CMD-Promptzeile abfackeln, wie ich an einer um 2 Blöcke erweiterten wspl.dat demonstrieren möchte:
SCALAR
ND 21516
ST 0
TS 10.00
0.0000
0.0000
0.0000
0.0000
0.0000
0.0000
...
SCALAR
ND 21516
ST 0
TS 14400.41
0.0000
115.8919
115.8919
115.8900
115.8861
115.8864
...
SCALAR
ND 21516
ST 0
TS 28800.33
0.0000
116.2450
116.2450
116.2397
116.2361
116.2369
SCALAR
ND 12345
ST 0
TS 10.00
0.0000
0.0000
0.0000
0.0000
0.0000
0.0000
...
SCALAR
ND 23456
ST 0
TS 14400.41
0.0000
115.8919
115.8919
115.8900
115.8861
115.8864
[ohne ">".... das ">" ist mein Prompt-Zeichen.... NICHT mit eingeben!]
>set "mv=0" & for /f "tokens=1-3 delims=:. " %i in ('findstr /n "^TS" wspl.dat') do @if %k GTR !mv! @(set "mv=%k" && set "ml=%i" & @echo mv=%k; !ml!)
mv=10; 4
mv=14400; 15
mv=28800; 26
Wenn ich dann noch "weiss", dass zwei Zeilen davor der NodeName steht und in den 5 Zeilen danach die Detailwerte, dann kann ich diese Zeilen gezielt herausfieseln.
>findstr /n $ wspl.dat|findstr "^24: ^26: ^27: ^28: ^29: ^30: ^31: ^32"
24:ND 21516
26:TS 28800.33
27: 0.0000
28: 116.2450
29: 116.2450
30: 116.2397
31: 116.2361
32: 116.2369
>for /f "delims=: tokens=2" %i in ('findstr /n $ wspl.dat^|findstr "^24: ^26: ^27: ^28: ^29: ^30: ^31: ^32"') do @echo %i
ND 21516
TS 28800.33
0.0000
116.2450
116.2450
116.2397
116.2361
116.2369
Oder habe ich es falsch verstanden?
Grüße
Biber