ghoyer
Goto Top

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):
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.
"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):
SCALAR
ND  21516
ST  0
TS     43200.19
    0.0000
  116.4927
  116.4927
  116.4711
  116.4741
  116.4742
...
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!):
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

Content-ID: 111195

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

Ausgedruckt am: 16.11.2024 um 15:11 Uhr

Biber
Biber 13.03.2009 um 18:56:16 Uhr
Goto Top
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
  • 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
Darauf schiesse ich diese Zeile ab vom CMD-Prompt:
[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!)  
... und erhalte (as should do) folgende Ausgabe:
mv=10; 4
mv=14400; 15
mv=28800; 26
---> 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.
>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
Nun muss ich nur noch die Zeilen-Nummern wieder entsorgen:
>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
Dann habe ich den Block, den Du wolltest.

Oder habe ich es falsch verstanden?

Grüße
Biber
ghoyer
ghoyer 15.03.2009 um 16:30:36 Uhr
Goto Top
Hallo, Batch-Großmeister,

Ich sehe, ich muss meine Ausdrucksweise verbessern.

Hatte ich schon erwähnt, das "ND" die ANZAHL der Knoten ist? Diese ist immer gleich.
Die TS-Werte sind von einer "Scheibe" zur nächsten aufsteigend (z.B. wird aller 2 h = 7200 s ein Daten-"Scheibchen" ausgeschrieben, d.h. an die WSPL.dat angehängt.).
Ansonsten sind die Kopfzeilen mehr oder weniger Schall und Rauch.

Die individuelle Knotennummer ist nicht in der Datei enthalten, die Zeilennummer in jedem Daten-"Scheibchen" entspricht hier der Knotennummer (abzüglich der paar Kopfzeilen)

Ich möchte im Ergebnis also einen einfaches Daten-"Scheibchen", in dem für jeden einzelnen Knoten steht, in welchem Zeitschitt (also WANN, der TS-Wert am Beginn jedes "Scheibchens") an diesem das für jeden Knoten individuelle Maximum erreicht wird. Das ist aufgrund von Wellenausbreitungen durchaus in unterschiedlichen Zeitschritten möglich.
Der individuelle Maximalwert steht ja schon in der WSPL_max.dat.

Ich hoffe, ich konnte alle Klarheiten beseitigen face-wink

Danke, Gisi