Top-Themen

Aktuelle Themen (A bis Z)

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, 3602 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 ..
Ähnliche Inhalte
LAN, WAN, Wireless
Anfängerfrage Routing
gelöst Frage von PharITLAN, WAN, Wireless10 Kommentare

Hallo allerseits, eine Frage, die ich mir nur mal interessehalber stelle: Die Telekom bietet hier einen Tarif mit 8 ...

Off Topic
Welchen Zweck hat so eine Konstruktion von Webseiten bzw. Händlern
Frage von Xaero1982Off Topic7 Kommentare

Hallo, ich wollte mir nen Drucker bestellen und jetzt bin ich auf was komisches gestoßen und raffe nicht welchen ...

Exchange Server
Outlook Exchanged Cache (Anfängerfrage)
Frage von ITraffnixExchange Server1 Kommentar

Hallo. Habe mal eine Anfängerfrage. Ich habe Mitarbeiter, bei denen ist das Arbeiten ohne Cache Mode schneller, als mit. ...

Visual Studio
Anfängerfrage zu INI-Dateien bei der Programmierung
gelöst Frage von Freund.der.NachtVisual Studio6 Kommentare

Guten Tag an alle! Ich habe in VB.Net ein Programm geschrieben. Da dieses Programm auch Einstellungen speichern muss, legt ...

Neue Wissensbeiträge
Windows 10

Autsch: Microsoft bündelt Windows 10 mit unsicherer Passwort-Manager-App

Tipp von kgborn vor 1 TagWindows 106 Kommentare

Unter Microsofts Windows 10 haben Endbenutzer keine Kontrolle mehr, was Microsoft an Apps auf dem Betriebssystem installiert (die Windows ...

Sicherheits-Tools

Achtung: Sicherheitslücke im FortiClient VPN-Client

Tipp von kgborn vor 1 TagSicherheits-Tools

Ich weiß nicht, wie häufig die NextGeneration Endpoint Protection-Lösung von Fortinet in deutschen Unternehmen eingesetzt wird. An dieser Stelle ...

Internet

USA: Die FCC schaff die Netzneutralität ab

Information von Frank vor 2 TagenInternet5 Kommentare

Jetzt beschädigt US-Präsident Donald Trump auch noch das Internet. Der neu eingesetzte FCC-Chef Ajit Pai ist bekannter Gegner einer ...

DSL, VDSL

ALL-BM200VDSL2V - Neues VDSL-Modem mit Vectoring von Allnet

Information von Lochkartenstanzer vor 2 TagenDSL, VDSL2 Kommentare

Moin, Falls jemand eine Alternative zu dem draytek sucht: Gruß lks

Heiß diskutierte Inhalte
Batch & Shell
Kann man mit einer .txt Datei eine .bat Datei öffnen?
gelöst Frage von HelloWorldBatch & Shell20 Kommentare

Wie schon im Titel beschrieben würde ich gerne durch einfaches klicken auf eine Text oder Word Datei eine Batch ...

Router & Routing
OpenWRT bzw. L.E.D.E auf Buffalo WZR-HP-AG300H - update
gelöst Frage von EpigeneseRouter & Routing11 Kommentare

Guten Tag, ich habe auf einem Buffalo WZR-HP-AG300H die alternative Firmware vom L.E.D.E Projekt geflasht. Ich bin es von ...

LAN, WAN, Wireless
WLAN Reichweite erhöhen mit neuer Antenne
gelöst Frage von gdconsultLAN, WAN, Wireless8 Kommentare

Hallo, ich besitze einen TL-WN722N USB-WLAN Dongle mit einer richtigen Antenne. Ich frage mich jetzt ob man die Reichweite ...

Router & Routing
Fritzbox Gastnetz - exposed Host - zur Sophos IPTV
Frage von medikopterRouter & Routing7 Kommentare

Hallo zusammen, ich habe eine Frage bezüglich des Fritz box Gastzugangs an einer Sophos UTM Home. An liebsten wäre ...