Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Anfängerfrage zu Script-Konstruktion

Frage Entwicklung Batch & Shell

Mitglied: mapauthor

mapauthor (Level 1) - Jetzt verbinden

04.03.2009, aktualisiert 16:41 Uhr, 3590 Aufrufe, 8 Kommentare

Ich bin ziemlich unerfahren im Scripten und habe folgendes Problem, von dem ich glaube, dass es sich verhälnismäßig einfach per Script automatisieren lassen müßte:

Unter Windows XP SP3 habe ich in einem Verzeichnis eine Reihe von Text-Dateien (33204108.mp, 33204109.mp, 33204208.mp, 33204209.mp, ...).
Der Dateiinhalt besteht im wesentlichen aus einer Vielzahl von sich wiederholenden Einträgen in Form von:

; Kommentar 
[POLYLINE] 
... 
[END] 
 
; Kommentar 
[POLYLINE] 
... 
[END]
Der Inhalt [POLYLINE] bis [END] ist jeweils variabel enhält aber zumindest immer eine Zeile, welche mit Data0= beginnt und danach eine Vielzahl von kommagetrennten Koordinatenangaben in runden Klammern enthält.
Allerdings gibt es eine Reihe von Fehlern, die darin bestehen, dass zwischen den Tags [POLYLINE] bis [END] der Ausdruck Data0= ab und an mehr als einmal vorhanden ist. Einige Beispielzeilen füge ich unten an:

; WayID = 30799184:0 
; highway=tertiary 
[POLYLINE] 
Type=0x5 
Label=D86 
EndLevel=2 
CityIdx=1 
RoadID=2870 
RouteParam=3,1,0,0,0,0,0,0,0,0,0,0 
Data0=(42.55619,8.97413),(42.55608,8.97386), [...] ,(42.55050,8.99999) 
Nod1=0,1238,0 
Nod2=110,4713,1 
Data0=(42.54548,8.99999),(42.54539,8.99993), [...] ,(42.54001,8.99999) 
Nodes1=(0,4714,1),(49,1264),(81,1267),(86,1270),(108,4715,1) 
[END]
Ich würde gerne per Script in jeder Textdatei nach allen diesen doppelten Einträgen suchen lassen und mir jeweils , wenn vorhanden, die Zeilennummer des doppelten Eintrags in eine log-Datei analog zum Dateinamen (33204108.log, 33204109.log, ...) schreiben lassen.

Kann mir jemand helfen?
Vielen Dank für alle Vorschläge!
Mitglied: Biber
04.03.2009 um 13:57 Uhr
Moin mapauthor,

willkommen im Forum.
Da Dein Problem ein zu 90% nur manuell (nicht automatisierbar) zu lösendes Problem zu sein scheint, wäre der Vor-Filter-Aufwand eigentlich schon mit einer Zeile vom CMD-Prompt angefackelt.

Vorbereitung (einmalig) am CMD-Prompt:
01.
echo [POLYLINE]>>suchworte.txt 
02.
echo Data0=>>suchworte.txt 
03.
echo [END]>>suchworte.txt
dann:
01.
>findstr /n /L /g:suchworte.txt D:\Ein\Dokument.txt 
02.
3:[POLYLINE] 
03.
10:Data0=(42.55619,8.97413),(42.55608,8.97386), [...] ,(42.55050,8.99999) 
04.
13:Data0=(42.54548,8.99999),(42.54539,8.99993), [...] ,(42.54001,8.99999) 
05.
15:[END] 
06.
....
So hast Du alle "doppelten" Data0-Zeilen auf dem Schirm.
Ich weiss nicht, ob der Aufwand lohnt, noch alle "Sections" rauszuschmeissen, die nur aus 3 Zeilen bestehen [POLYLINE], Data0=.., [END]?

Von wieviel Sections je Datei reden wir denn?

Grüße
Biber
Bitte warten ..
Mitglied: mapauthor
04.03.2009 um 16:35 Uhr
Hallo Biber,

danke für die schnelle Antwort!

In Anlehnung an Deinen Vorschlag habe ich in einer Stapelverarbeitungsdatei die zeilen

FINDSTR /N /L /C:"Data0=" D:\christian\GIS\_findstr\00.mp
eingefügt und gestartet. cmd.exe fängt danach an zu rennen und hört ohne Angabe zu Ergebnissen überhaupt nicht mehr auf zu laufen.

Genaueres noch zu meiner Ausgangssituation:
Ich habe ca. 100 Dateien (*.mp) und jede Datei enthält bis zu 100000 Zeilen Text/Code. In den Zeilen, welche mit Data0= beginnen, stehen zwischen den runden Klammern Koordinatenangaben, die die Linien in einer Vekktorkarte beschreiben. Diese Angaben sind in jeder 'Section' unterschiedlich und mitunter sind dies pro 'Section' auch mal aberhunderte von Ausdrücken. Im Beispiel hatte ich vollständige Wiedergabe verzichtet.

Meine Vorstellung wäre, dass nur für den Fall das in einer der vielen 'Sections' zwischen [POLYLINE] und [END] der Eintrag Data0= doppelt auftaucht ich eine Zeilennummer geliefert bekomme bezogen auf doppelten Eintrag.

Gibt es weitere Ideen?
Für hilfe wäre ich sehr dankbar...
Bitte warten ..
Mitglied: Biber
04.03.2009 um 16:50 Uhr
Moin mapauthor,

Das beschriebene Verhalten...
fängt danach an zu rennen und hört ohne Angabe zu Ergebnissen überhaupt nicht mehr auf zu laufen.
....deutet IMHO darauf hin, dass
  • entweder Windows-konforme CRLFs/Zeilenendemarken fehlen (kommen die Daten von einem Unix-Server?)
  • oder aber einzelne Zeilen zu lang für das Findstr.exe-Utiltily werden.

Anyhow - ein nun etwas klarer erkennbarerer Lösungsweg ginge wohl in Richtung der sed-Utilitiys

Auch dazu haben wir einige Spezialisten hier im Forum - ich stell mich allerdings bei diesem Thema in die zweite Reihe.

Grüße
Biber
Bitte warten ..
Mitglied: mapauthor
04.03.2009 um 17:37 Uhr
Hallo Biber,

Zeilenenden sind CRLF. Danke soweit...

Grüsse
Bitte warten ..
Mitglied: bastla
04.03.2009 um 18:28 Uhr
Hallo mapauthor und Biber!

Da ich hinsichtlich "sed" auch nur Gelegenheitstäter bin, ein Versuch mit VBS:
01.
Suche = "Data0=" 
02.
Start = "[POLYLINE]" 
03.
Datei = WScript.Arguments(0) 
04.
LogDatei = WScript.Arguments(1) 
05.
 
06.
LSuche = Len(Suche) 
07.
LStart = Len(Start) 
08.
 
09.
Set fso = CreateObject("Scripting.FileSystemObject") 
10.
Set Ein = fso.OpenTextFile(Datei) 
11.
Set Aus = fso.OpenTextFile(LogDatei, 8, True) 
12.
 
13.
Aus.WriteLine Datei 
14.
Do While Not Ein.AtEndOfStream 
15.
    Zeile = Ein.ReadLine 
16.
    ZNr = ZNr + 1 
17.
    If Left(Zeile, LStart) = Start Then 
18.
        Anzahl = 0 
19.
    ElseIf Left(Zeile, LSuche) = Suche Then 
20.
        Anzahl = Anzahl + 1 
21.
        If Anzahl > 1 Then Aus.WriteLine ZNr 
22.
    End If 
23.
Loop 
24.
Aus.WriteBlankLines 2 
25.
Aus.Close 
26.
Ein.Close
Beim Aufruf anzugeben sind die zu untersuchende Datei sowie die Logdatei (diese wird nicht überschrieben, sondern ergänzt) - Beispiel:
cscript //nologo "D:\christian\GIS\_vbs\LogMultipleData0Lines.vbs" "D:\christian\GIS\_vbs\00.mp" "D:\christian\GIS\_vbs\Zeilen.log"
Vereinfacht habe ich dahingehend, dass bei jeder mit "[POLYLINE]" beginnenden Zeile ohne Berücksichtigung eines folgenden "[END]" die Zählung der "Data0"-Zeilen neu beginnt. Außerdem gibt es für die übergebenen Dateien keine Überprüfung des Pfades bzw auf Vorhandensein (dies unter der Annahme, dass das Script von einem Batch aus einer Schleife über alle .mp-Dateien aufgerufen werden wird).

Grüße
bastla
Bitte warten ..
Mitglied: mapauthor
04.03.2009 um 19:52 Uhr
Hallo Bastla!

Vielen Dank für die Mühe!

Ich verstehe zwar nur Bahnhof, ich habe das Script aber gerade zum Laufen gebracht.

Im Ansatz passiert, was ich mir erhofft habe: In der Log-Datei stehen zeilenweise Nummern von Zeilen, in denen das Element Data0= enthalten ist:

D:\christian\GIS\_vbs\00.mp 
5788 
5797 
5807 
5817 
5827 
5837 
5846 
5856 
...
Problem noch: Es wird jedes Data0= Element ausgegeben und zwar nicht nur wenn es doppelt zwischen [POLYLINE] und [End] vorhanden ist. Zudem werden Einträge, welche in einer ähnlichen Section liegen, die mit [POI]...[Ende] bzw. [POLYGON]...[Ende] makiert sind ebenfalls mit ausgegeben. Kann man dagegen etwas tuen?

Freue mich über jeden Vorschlage, Danke!
Bitte warten ..
Mitglied: bastla
04.03.2009 um 20:25 Uhr
Hallo mapauthor!

Dann auf einer etwas veränderten Basis:
Es wird in dieser Version nur mehr überprüft, ob "[POLYLINE]" in der Zeile enthalten ist - oben hatte ich noch die Position Zeilenanfang vorausgesetzt (was ev öfter nicht der Fall gewesen sein könnte, da ansonsten das nächstfolgende "Data0=" hätte übersprungen werden müssen).

Zusätzlich werden alle "Data0="-Zeilen, welche nach einem "[END]" und vor dem nächsten "[POLYLINE]" folgen, ignoriert. Außerdem erfolgt der Vergleich auf "[POLYLINE]" bzw "[END]" ohne Berücksichtigung von Groß-/Kleinschreibung.
01.
Suche = "Data0=" 
02.
Start = "[POLYLINE]" 
03.
Ende = "[END]" 
04.
Datei = WScript.Arguments(0) 
05.
LogDatei = WScript.Arguments(1)  
06.
 
07.
LSuche = Len(Suche) 
08.
 
09.
Set fso = CreateObject("Scripting.FileSystemObject") 
10.
Set Ein = fso.OpenTextFile(Datei) 
11.
Set Aus = fso.OpenTextFile(LogDatei, 8, True) 
12.
 
13.
Aus.WriteLine Datei 
14.
Do While Not Ein.AtEndOfStream 
15.
    Zeile = Ein.ReadLine 
16.
    ZNr = ZNr + 1 
17.
    If InStr(1, Zeile, Start, vbTextCompare) > 0 Then 
18.
        Anzahl = 0 
19.
        InSection = True 
20.
    ElseIf InStr(1, Zeile, Ende, vbTextCompare) > 0 Then 
21.
        InSection = False 
22.
    ElseIf Left(Zeile, LSuche) = Suche Then 
23.
        If InSection Then 
24.
            Anzahl = Anzahl + 1 
25.
            If Anzahl > 1 Then Aus.WriteLine ZNr 
26.
        End If 
27.
    End If 
28.
Loop 
29.
Aus.WriteBlankLines 2 
30.
Aus.Close 
31.
Ein.Close
Grüße
bastla

P.S.: Enden zB die "[POLYGON]"-Sections tatsächlich mit "[ENDE]" (groß oder klein geschrieben egal) und könnte das auch bei "[POLYLINE]"-Bereichen der Fall sein?
Bitte warten ..
Mitglied: mapauthor
04.03.2009 um 21:42 Uhr
Hallo Bastla!

Nocheinmal vielen Dank für die Mühe!

Ich habe die neue Version gerade testweise laufen lassen und es scheint wie erhofft zu funktionieren. Selbst bei einer Datei mit über 2,5 Mio Zeilen läuft es stabil und das Log-File wird mit Beginn eines Durchlaufs auf einer neuen Datei einfach unter Angabe des neuen Dateinamen erweitert. Toll!
Auf die Frage im PS: Sowohl die zu durchsuchenden Sections mit [POLYLINE], als auch die zu ignorierenden Sections [Polygon] und [POI] enden jeweils bevor die nächste Section beginnt mit [END]. Der Ausdruck innerhalb der eckigen Klammern ist dabei in Großbuchstaben.

Nochmals vielen an Dich und Biber!

Einen schönen Abend...

Grüße
mapauthor
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Batch & Shell
gelöst PowerShell Script Move-Item nach x Tagen (5)

Frage von lupolo zum Thema Batch & Shell ...

VB for Applications
VBS Script zum versenden mehrerer Verknüpfungen zu Dateien per Lotus Notes

Frage von Sentinel87 zum Thema VB for Applications ...

Batch & Shell
Script zum Auflösen einer Ordnerstruktur und zurück gesucht (12)

Frage von websolutions zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Microsoft
Ordner mit LW-Buchstaben versehen und benennen (21)

Frage von Xaero1982 zum Thema Microsoft ...

Windows Update
Treiberinstallation durch Windows Update läßt sich nicht verhindern (17)

Frage von liquidbase zum Thema Windows Update ...

Windows Tools
gelöst Aussendienst Datensynchronisierung (12)

Frage von lighningcrow zum Thema Windows Tools ...

Windows Server
RODC über VPN - Verbindung weg (10)

Frage von stefan2k1 zum Thema Windows Server ...