fabmeister19
Goto Top

Werte filtern und in neue Datei schreiben mit Batch

Hallo,
ich habe folgendes Problem: Ich habe als Grundlage ein ASCII-File in dem über 1.6 Mio Punkte in folgender Form vorhanden sind:

4494350.50 5755800.50 52.85
4494450.50 5756800.50 52.85
4494650.50 5757800.50 52.85

Dabei beschreibt der erste Wert den Rechtswert, der zweite den Hochwert und der dritte die Höhe. Nun hab ich folgendes Problem: Für mein digatales Geländemodell benötige ich von den 1.6 Millionen Punkten nur einen bestimmten Wertebereich.

Umgangssprachlich würde ich es folgendermaßen ausdrücken:

WENN RECHTSWERT größer als 4494350.50 UND HOCHWERT größer als 5755800.50 dann
SCHREIBE ZEILE IN ZIELDATEI.TXT
SONST LIES NÄCHSTE ZEILE

Ich möchte also mit if-Abfragen bestimmte Zeilen aus der ASCII - Datei filtern und diese in eine neue ASCII Datei schreiben, dabei soll er immer die aktuell gefundene Zeile an die jetzige anhängen.

Über eure Antworten würde ich mich freune und bedanke mich schonmal im Voraus.

Content-Key: 141759

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

Printed on: April 19, 2024 at 16:04 o'clock

Member: maretz
maretz Apr 29, 2010 at 13:17:26 (UTC)
Goto Top
Muss das ne Dos-Batch sein oder gehen auch Scriptsprachen wie Perl? Weil dann wäre es zimlich simpel -> gucken ob die erste Zahl im Bereich liegt -> wenn ja die Zeile in nen Array schreiben. Am ende der File die Quelldatei schliessen, ne neue Datei erstellen/öffnen und den Inhalt des Arrays da reinpumpen...
Member: Snowman25
Snowman25 Apr 29, 2010 at 13:23:17 (UTC)
Goto Top
Darf ich fragen, mit welchem Programm du arbeitest? (ArcGIS, etc.? )
Mitglied: 77559
77559 Apr 29, 2010 at 13:34:03 (UTC)
Goto Top
Hallo fabmeister19,

kein Problem mit Batch vielleicht nicht superschnell.

@Echo off
Set InFile=Test.asc
Set OutFile=Out.txt

:: UNTEN  LINKS: (4494350.50 ; 5755800.50) = MinX,MinY
:: OBEN  RECHTS: (4494930.50 ; 5756000.50) = MaxX,MaxY

Set MinX=4494350.50
Set MaxX=4494930.50
Set MinY=5755800.50
Set MaxY=5755800.50

For /f "delims=" %%A in (%InFile%) Do Call :Check %%A  
Goto :Eof
:Check
Echo All %*
if %1 LSS %MinX% goto :eof
if %1 GTR %MaxX% goto :eof
if %2 LSS %MinY% goto :eof
if %2 GTR %MaxY% goto :eof
Echo --- %*
>> %OutFile% Echo.%*

zu Testzwecken gebe ich zusätzlich alle Zeilem aus

Gruß
LotPings

Edit: Ich habe die X,Y Min,Max etwas eindeutiger formuliert
Member: fabmeister19
fabmeister19 Apr 29, 2010 at 13:35:33 (UTC)
Goto Top
naja womit man das realisiert ist mir eigentlich egal. aber nur zu gucken ob die erste zahl im bereich liegt würde glaub ich nicht ausreichen, weil es gibt Punkte die haben gleiche Rechtswerte, aber unterschiedliche Hochwerte, aber wenn ich meinen Wertebereich mit nem Rechteck oder so ähnlich definiert habe, dann hätte ich ja den Wertebereich.
Member: fabmeister19
fabmeister19 Apr 29, 2010 at 13:37:08 (UTC)
Goto Top
ja mit ArcGiS auch aber irgendwie will er die datei nicht importieren. in dem speziellen Falle aber nicht. auch umbennen etc hat nicht funktioniert.
Member: fabmeister19
fabmeister19 Apr 29, 2010 at 13:42:01 (UTC)
Goto Top
ok danke ich teste das mal. Ich hab vorhin noch was vergessen, ich müsste überprüfen ob die Werte Rechts und Hoch größer sind als irgendwas aber gleichzeitig kleiner als nen anderer Wert.

ALSO für alle mal zum Verständnis ich habe mir ein Rechteck definiert mit folgenden Koordinaten:

OBEN LINKS: (4494350.50 ; 5756000.50)
UNTEN LINKS: (4494350.50 ; 5755800.50)
OBEN RECHTS: (4494930.50 ; 5756000.50)
UNTEN RECHTS: (4494930.50 ; 5755800.50)

In dem Bereich müssten also alle Zeilen liegen die ich in meine gefilterte Datei schreiben möchte.
Member: Snowman25
Snowman25 Apr 29, 2010 at 13:47:57 (UTC)
Goto Top
Tausche
If %1 LEQ 4494350.50 Goto :Eof 
If %2 LEQ 5755800.50 Goto :Eof
gegen
If %1 GEQ 4494930.50 (
  Goto :Eof
) else (
  if %1 LEQ 4494350.50 (
    Goto :Eof 
  )
)
If %2 GEQ 5756000.50 (
  Goto :Eof
) else (
  if %2 LEQ 5755800.50 (
    Goto :Eof 
  )
)

So sollte das passen..
Member: bastla
bastla Apr 29, 2010 at 14:29:34 (UTC)
Goto Top
... obwohl:
if %1 LSS 4494350.50 goto :eof
if %2 GTR 5756000.50 goto :eof

if %1 GTR 4494930.50 goto :eof
if %2 LSS 5755800.50 goto :eof
wäre für mich übersichtlicher ...

Grüße
bastla
Member: Snowman25
Snowman25 Apr 29, 2010 at 14:31:55 (UTC)
Goto Top
hmm... stimmt eigentlich. Hab mal wieder Knoten im Hirn.
Member: fabmeister19
fabmeister19 Apr 29, 2010 at 17:19:00 (UTC)
Goto Top
danke für eure schnelle Hilfe. Ich lass das mal durchlaufen und meld mich morgen nochmal ob es geklappt hat.
Mitglied: 77559
77559 Apr 29, 2010 at 17:45:17 (UTC)
Goto Top
Hallo fabmeister19,

ich habe die vorgeschlagenen Änderungen oben direkt eingebaut und (hoffe ich) eindeutiger formuliert.

Gruß
LotPings
Member: fabmeister19
fabmeister19 Apr 30, 2010 at 05:08:52 (UTC)
Goto Top
Super, ihr seid klasse!!! Hat funktioniert!
Danke vielmals!