Hallo,
Bin hier mit meinen Latein am Ende. Ich möchte per Regex-Befehl in einer Textdatei die Anordnung der Zeilen ändern. Am Anfang der Zeile sind jede Menge Koordinaten, dann kommt spitze Klammer, danach Attribute.
Ich möchte das es genau anders herum ist (erst Attribute dann Koordinaten)
Hier ein Beispiel:
4580167.885 -5600906.93 4580147.888 -5600906.624 4580164.96 -5600899.578 <"F ID1704261306362 OS2500010F HELITRACK_38 {Mi Apr 26 13:06:36 CEST 2017} C:/data
So brauche ich es:
<"F ID1704261306362 OS2500010F HELITRACK_38 {Mi Apr 26 13:06:36 CEST 2017} C:/data 4580150.818 -5600913.72 4580167.885 -5600906.93 4580147.888 -5600906.624 4580164.96 -5600899.578
Die Länge der Zeile ist immer unterschiedlich. Die spitze Klammer ist aber immer der Trenner und kommt auch immer nur einmal vor.
Wäre über Vorschläge und Hilfe sehr dankbar.
Raffel
Zeilen in Text umstellen
Moderator: jNizM
Re: Zeilen in Text umstellen
Hierfür lohnt es sich eher nicht mit RegEx zu arbeiten.
Hier wäre ein ParseLoop mit StrSplit wohl die beste Lösung:
Text Zeile für Zeile einlesen -> mit StrSplit Befehl bei "<" auftrennen -> den in umgekehrter Reihenfolge mit "<" und neuer Zeile einer Text-Variable hinzufügen -> ??? ->Profit
Hier wäre ein ParseLoop mit StrSplit wohl die beste Lösung:
Text Zeile für Zeile einlesen -> mit StrSplit Befehl bei "<" auftrennen -> den in umgekehrter Reihenfolge mit "<" und neuer Zeile einer Text-Variable hinzufügen -> ??? ->Profit
Recommends AHK Studio
Re: Zeilen in Text umstellen
Oje, klingt kompliziert. da muß ich mich erst mal rein lesen in den Weiten des www.
Danke erstmal.
Danke erstmal.
Re: Zeilen in Text umstellen
Nicht wirklich kompliziert.
nnnik's vorschlag sollte als code etwa so aussehen ...Nicht getestet.
nnnik's vorschlag sollte als code etwa so aussehen ...
Code: Select all
zeile = 4580167.885 -5600906.93 4580147.888 -5600906.624 4580164.96 -5600899.578 <"F ID1704261306362 OS2500010F HELITRACK_38 {Mi Apr 26 13:06:36 CEST 2017} C:/data
teilzeile := StrSplit(zeile,"<") ; zeile mit StrSplit am 'separator' < zerlegen
MsgBox % neuezeile := "<" . teilzeile[2] . " " . teilzeile[1] ; separator und leerzeichen wieder hinzufügen und zeile neu zusammensetzen
Re: Zeilen in Text umstellen
Danke erst mal BoBo. Habe schon alles versucht, was ich so gelesen habe. Aber so richtig komme ich nicht weiter.
Wenn ihr noch etwas mehr Hilfestellung geben könntet, wäre ich sehr dankbar.
Wenn ihr noch etwas mehr Hilfestellung geben könntet, wäre ich sehr dankbar.
Re: Zeilen in Text umstellen
Was hast Du denn versucht, und was funktioniert an BoBos Code nicht so, wie Du es willst?
Re: Zeilen in Text umstellen
das ist ja nur die eine Zeile, welche allerdings auch nicht umgestellt wird. Leider habe ich jetzt mein Versuchsscript vor lauter Frust gelöscht, sonst hätte ich es mal eingefügt.
Mir fehlt noch der allgemeine Aufbau, der Loop zum zeilenweisen einlesen oder brauche ich den nicht bei Stringsplit ?
Mir fehlt noch der allgemeine Aufbau, der Loop zum zeilenweisen einlesen oder brauche ich den nicht bei Stringsplit ?
Re: Zeilen in Text umstellen
Mit dem Loop würdest du Zeile arbeiten - und ohne Versuchskript wird es schwierig für uns zu sehen woran es gescheitert ist.
Recommends AHK Studio
Re: Zeilen in Text umstellen
Wenn ich jetzt mein Versuch hochlade, bitte nicht lachen
Mit Textpad habe ich mir schon ein Macro geschrieben um die Aufgabe zu lösen. Leider braucht es ewig bis zum Ende der Textdatei. So dachte ich mir, das es mit AHK bestimmt eleganter wäre die Aufgabe zu lösen. In AHK bin ich allerdings absoluter Neuling. Ich habe jetzt schon das Internet nach allen möglichen Lösungen durchforstet, aber so richtig blicke ich es nicht. Zum Beispiel, wie kann ich die Zeilenumwandlung bei in der Textdatei speichern. Ich bekomme sie nur in der MFG-Box angezeigt.
Naja, hier ein Code.
Mit Textpad habe ich mir schon ein Macro geschrieben um die Aufgabe zu lösen. Leider braucht es ewig bis zum Ende der Textdatei. So dachte ich mir, das es mit AHK bestimmt eleganter wäre die Aufgabe zu lösen. In AHK bin ich allerdings absoluter Neuling. Ich habe jetzt schon das Internet nach allen möglichen Lösungen durchforstet, aber so richtig blicke ich es nicht. Zum Beispiel, wie kann ich die Zeilenumwandlung bei in der Textdatei speichern. Ich bekomme sie nur in der MFG-Box angezeigt.
Naja, hier ein Code.
Code: Select all
FileSelectFile, Quelldatei, 3,,
if Quelldatei =
return
Loop, read, %Quelldatei%, %Zieldatei%
teilzeile := StrSplit(zeile,"<") ; zeile mit StrSplit am 'separator' < zerlegen
MsgBox % neuezeile := "<" . teilzeile[2] . " " . teilzeile[1] ; separator und leerzeichen wieder hinzufügen und zeile neu zusammensetzen
return
Re: Zeilen in Text umstellen
Zum einen sehe ich für die variable zur ausgabedatei keine gültige definition, zum anderen fehlt im loop der befehl zum schreiben in die selbige.
Und der loop scheint mir zudem nicht für/als mehrzeiler ausgelegt zu sein.
Und der loop scheint mir zudem nicht für/als mehrzeiler ausgelegt zu sein.
Re: Zeilen in Text umstellen
Beispiel-1
Beispiel-2 mit FileSelect
Code: Select all
;- create test-file ---------------
f1=%a_scriptdir%\test1.txt
ifnotexist,%f1%
{
d=
(
1580167.885 -5600906.93 4580147.888 -5600906.624 4580164.96 -5600899.578 <"F ID1704261306362 OS2500010F HELITRACK_38 {Mi Apr 26 13:06:36 CEST 2017} C:/data
2580167.885 -5600906.93 4580147.888 -5600906.624 4580164.96 -5600899.578 <"F ID1704261306362 OS2500010F HELITRACK_38 {Mi Apr 26 13:06:36 CEST 2017} C:/data
3580167.885 -5600906.93 4580147.888 -5600906.624 4580164.96 -5600899.578 <"F ID1704261306362 OS2500010F HELITRACK_38 {Mi Apr 26 13:06:36 CEST 2017} C:/data
)
fileappend,%d%,%f1%
d=
}
;------------------------------------
f2=%a_scriptdir%\test1_NEW.txt
fileread,aa,%f1%
loop,parse,aa,`n,`r
{
x:=a_loopfield
if x=
continue
stringsplit,C,x,`<,
e .= "<" . c2 . " " . c1 "`r`n"
}
;msgbox,%e%
aa=
if e<>
{
fileappend,%e%,%f2%
e=
run,%f2%
}
exitapp
;===========================================================
Code: Select all
f2=%a_scriptdir%\test2_NEW.txt
aa1=%a_desktop% ;- search file from here
FileSelectFile, filename,1,%aa1%,Select your file,*.txt;*.log
if filename =
return
fileread,aa,%filename%
loop,parse,aa,`n,`r
{
x:=a_loopfield
if x=
continue
stringsplit,C,x,`<,
e .= "<" . c2 . " " . c1 "`r`n"
}
aa=
if e<>
{
ifnotexist,%f2%
fileappend,%e%,%f2%
e=
run,%f2%
}
return
Last edited by garry on 08 Oct 2017, 07:43, edited 1 time in total.
Re: Zeilen in Text umstellen
Hallo garry.
Perfekt das Script. Vielen, vielen Dank.
Da hätte ich noch jahre dran gesessen. Nur noch eine Frage. Wenn ich es in die gleichen Datei schreiben möchte, muss ich da ein FileDelete vor Append einfügen?
Danke noch mal
Perfekt das Script. Vielen, vielen Dank.
Da hätte ich noch jahre dran gesessen. Nur noch eine Frage. Wenn ich es in die gleichen Datei schreiben möchte, muss ich da ein FileDelete vor Append einfügen?
Danke noch mal
Re: Zeilen in Text umstellen
fileappend schreibt immer in die gleiche Datei (anfügen) wenn der Befehl 'ifnotexist' weggelassen wird
im script schreibt nur einmal , wegen dem Befehl 'ifnotexist'
kannst auch Filename jeweils ändern , z.B. F2=%a_scriptdir%\%a_now%_test.txt (Datumsformat) und denn fileappend,%e%,%f2%
im script schreibt nur einmal , wegen dem Befehl 'ifnotexist'
kannst auch Filename jeweils ändern , z.B. F2=%a_scriptdir%\%a_now%_test.txt (Datumsformat) und denn fileappend,%e%,%f2%
Code: Select all
;....
ifnotexist,%f2%
fileappend,%e%`r`n------------------------------------`r`n`r`n,%f2% ;- dies schreibt am Schluss noch einen Trennstrich und eine leere Linie
;....
Re: Zeilen in Text umstellen
Ich noch mal. Hatte was vergessen. Ich müsste vor der Umstellung der Zeilen, was übrigens super klappt, noch was suchen und ersetzten lassen. es müssten die oberen Zeilen mit der Raute davor weg und das .view create Polygon mit nichts ersetzten.
Hier zu sehen:
# -------------------------------------------------
# 08 September 2017 15:50
# Projektfile (KARSTA V2.0)
# -------------------------------------------------
# C:/data/HeliService/prj/2017/Sachsen/Marienberg/Marienberg-Gesamt.prj
#
# Nullpunkt:
# Rechtswert 4500000.0
# Hochswert 5600000.0
#
# -------------------------------------------------
# set VIEW(RW) 4500000.0
# set VIEW(HW) 5600000.0
.view create polygon 4580161.889 -5600930.802 4580161.809 -5600930.802 4580161
.view create polygon 4580161.7 -5600930.986 4580161.688 -5600930.986 4580161.6
.view create polygon 4580172.268 -5600943.2 4580172.316 -5600943.2 4580172.316
.view create polygon 4584082.041 -5602259.024 4584091.304 -5602254.669 4584108
.view create polygon 4583889.471 -5602350.483 4583901.215 -5602345.655 4583919
Kann ich das vor der zeilenumstellung einfügen? Ich weiß einfach nicht was ich bei StringReplace als OutputVar, InputVar einsetzten soll
Hier das Script
Hier zu sehen:
# -------------------------------------------------
# 08 September 2017 15:50
# Projektfile (KARSTA V2.0)
# -------------------------------------------------
# C:/data/HeliService/prj/2017/Sachsen/Marienberg/Marienberg-Gesamt.prj
#
# Nullpunkt:
# Rechtswert 4500000.0
# Hochswert 5600000.0
#
# -------------------------------------------------
# set VIEW(RW) 4500000.0
# set VIEW(HW) 5600000.0
.view create polygon 4580161.889 -5600930.802 4580161.809 -5600930.802 4580161
.view create polygon 4580161.7 -5600930.986 4580161.688 -5600930.986 4580161.6
.view create polygon 4580172.268 -5600943.2 4580172.316 -5600943.2 4580172.316
.view create polygon 4584082.041 -5602259.024 4584091.304 -5602254.669 4584108
.view create polygon 4583889.471 -5602350.483 4583901.215 -5602345.655 4583919
Kann ich das vor der zeilenumstellung einfügen? Ich weiß einfach nicht was ich bei StringReplace als OutputVar, InputVar einsetzten soll
Hier das Script
Code: Select all
f2=%a_scriptdir%\PRJ-neu.txt
aa1=%a_desktop% ;- search file from here
FileSelectFile, filename,1,%aa1%,Select your file,*.txt;*.log;*.prj
if filename =
return
fileread,aa,%filename%
StringReplace, Text, Text, .view create polygon ,, All
sleep, 2000
loop,parse,aa,`n,`r
{
x:=a_loopfield
if x=
continue
stringsplit,C,x,`<,
e .= "<" . c2 . " " . c1 "`r`n"
}
if e<>
{
ifnotexist,%f2%
fileappend,%e%,%f2%
e=
run,%f2%
}
return
Re: Zeilen in Text umstellen
Code: Select all
fileread,aa,%filename%
Die Kommentarzeilen mit dem führenden # kannst Du in der Schleife überlesen:
Code: Select all
If (x = "") Or (SubStr(x, 1, 1) = "#") ; leere Zeile oder Zeile mit führendem #
Continue
Wer sich mit AHK nicht auskennt, kann das ruhig sagen. Deine ursprüngliche Frage nach einem RegEx hätte auch von einem Nutzer kommen können, der schon einige AHK-Erfahrung hat. Wenn das die einzige Frage ist, gehe ich z.B. davon aus, dass Du den Rest (wie z.B. das zeilenweise Einlesen der Datei) im Griff hast.
Re: Zeilen in Text umstellen
@just me , danke
Beispiel mit testfile
Beispiel mit testfile
Code: Select all
;- create test-file ---------------
f1=%a_scriptdir%\test1.txt
ifnotexist,%f1%
{
d=
(
# -------------------------------------------------
# 08 September 2017 15:50
# Projektfile (KARSTA V2.0)
# -------------------------------------------------
# C:/data/HeliService/prj/2017/Sachsen/Marienberg/Marienberg-Gesamt.prj
#
# Nullpunkt:
# Rechtswert 4500000.0
# Hochswert 5600000.0
#
# -------------------------------------------------
# set VIEW(RW) 4500000.0
# set VIEW(HW) 5600000.0
.view create polygon 4580161.889 -5600930.802 4580161.809 -5600930.802 4580161
.view create polygon 4580161.7 -5600930.986 4580161.688 -5600930.986 4580161.6
.view create polygon 4580172.268 -5600943.2 4580172.316 -5600943.2 4580172.316
.view create polygon 4584082.041 -5602259.024 4584091.304 -5602254.669 4584108
.view create polygon 4583889.471 -5602350.483 4583901.215 -5602345.655 4583919
1580167.885 -5600906.93 4580147.888 -5600906.624 4580164.96 -5600899.578 <"F ID1704261306362 OS2500010F HELITRACK_38 {Mi Apr 26 13:06:36 CEST 2017} C:/data
2580167.885 -5600906.93 4580147.888 -5600906.624 4580164.96 -5600899.578 <"F ID1704261306362 OS2500010F HELITRACK_38 {Mi Apr 26 13:06:36 CEST 2017} C:/data
3580167.885 -5600906.93 4580147.888 -5600906.624 4580164.96 -5600899.578 <"F ID1704261306362 OS2500010F HELITRACK_38 {Mi Apr 26 13:06:36 CEST 2017} C:/data
)
fileappend,%d%,%f1%
d=
}
;------------------------------------
f2=%a_scriptdir%\test1_NEW.txt
ifexist,%f2%
filedelete,%f2%
fileread,aa,%f1%
x1:=".view create polygon "
stringreplace,aa,aa,%x1%,,all
loop,parse,aa,`n,`r
{
x:=a_loopfield
If (x = "") Or (SubStr(x, 1, 1) = "#") ; leere Zeile oder Zeile mit führendem #
continue
if x contains <`"F
{
stringsplit,C,x,`<,
e .= "<" . c2 . " " . c1 "`r`n"
}
else
e .= x . "`r`n"
}
;msgbox,%e%
aa=
if e<>
{
fileappend,%e%,%f2%
e=
run,%f2%
}
exitapp
;---------------------------------------------------------
;- test1_NEW.txt :
/*
4580161.889 -5600930.802 4580161.809 -5600930.802 4580161
4580161.7 -5600930.986 4580161.688 -5600930.986 4580161.6
4580172.268 -5600943.2 4580172.316 -5600943.2 4580172.316
4584082.041 -5602259.024 4584091.304 -5602254.669 4584108
4583889.471 -5602350.483 4583901.215 -5602345.655 4583919
<"F ID1704261306362 OS2500010F HELITRACK_38 {Mi Apr 26 13:06:36 CEST 2017} C:/data 1580167.885 -5600906.93 4580147.888 -5600906.624 4580164.96 -5600899.578
<"F ID1704261306362 OS2500010F HELITRACK_38 {Mi Apr 26 13:06:36 CEST 2017} C:/data 2580167.885 -5600906.93 4580147.888 -5600906.624 4580164.96 -5600899.578
<"F ID1704261306362 OS2500010F HELITRACK_38 {Mi Apr 26 13:06:36 CEST 2017} C:/data 3580167.885 -5600906.93 4580147.888 -5600906.624 4580164.96 -5600899.578
*/
;===========================================================
Re: Zeilen in Text umstellen
Hat super geklappt. mein Script sieht jetzt so aus
Kann ich den run-Befehl irgendwie ändern, das die Datei mit Textpad aufgeht. Muss dort nämlich noch ein makro ausführen zum Abschluß. Dieses letzte Makro in AHK zu realisieren schaffe ich sowieso nicht. Ich will auch eure Geduld nicht überstrapazieren mit mir Anfänger. Wenn ich mal mehr Zeit habe und mich noch besser eingelesen habe in AHK komme ich bestimmt noch mal zwecks Hilfestellung. Wenn es jetzt mit Textpad aufging wäre ich schon glücklich.
Hier nur mal ein Vorgeschmack wie die Datei letzlich aussehen muß, damit ich sie in GlobalMapper einlesen kann. Hatte ich in Textpad mit Suchen-Ersetzen und Zeilenumbruch gemacht.
DESCRIPTION=Heli-Aufzeichnung
CLOSED=YES
ID1704260853181
TS0100
FS250
OS2500010F
HELI
TRACK_2
Mi
Apr
26
08:53:18
CEST
2017
C:/data/HeliService/prj/2017/Sachsen/Marienberg/Marien01Ram.prj
4580161.889,5600930.802
4580161.809,5600930.802
4580161.809,5600910.802
4580161.849,5600930.802
4580161.849,5600910.802
4580161.809,5600930.802
4580161.809,5600910.802
4580161.889,5600910.802
DESCRIPTION=Heli-Aufzeichnung
CLOSED=YES
ID1704260855381
TS0100
FS250
OS2500010F
HELI
TRACK_3
Mi
Apr
26
08:55:38
CEST
2017
C:/data/HeliService/prj/2017/Sachsen/Marienberg/Marien01Ram.prj
4580161.7,5600930.986
4580161.688,5600930.986
4580161.688,5600910.986
4580161.704,5600930.986
4580161.704,5600910.986
4580161.688,5600930.986
4580161.688,5600910.986
4580161.7,5600910.986
Code: Select all
f2=%a_scriptdir%\PRJ-neu.txt
aa1=%a_desktop% ;- search file from here
FileSelectFile, filename,1,%aa1%,Select your file,*.txt;*.log;*.prj
if filename =
return
fileread,aa,%filename%
StringReplace, aa, aa, .view create polygon ,, All
StringReplace, aa, aa, -fill "grey" -tags "F , <"F, All
StringReplace, aa, aa, P2 DUMP" -smooth 0 -outline "black" -stipple "",, All
sleep, 2000
loop,parse,aa,`n,`r
{
x:=a_loopfield
If (x = "") Or (SubStr(x, 1, 1) = "#") ; leere Zeile oder Zeile mit führendem #
continue
stringsplit,C,x,`<,
e .= "<" . c2 . " " . c1 "`r`n"
}
if e<>
{
ifnotexist,%f2%
fileappend,%e%,%f2%
e=
run, %f2%
}
return
Kann ich den run-Befehl irgendwie ändern, das die Datei mit Textpad aufgeht. Muss dort nämlich noch ein makro ausführen zum Abschluß. Dieses letzte Makro in AHK zu realisieren schaffe ich sowieso nicht. Ich will auch eure Geduld nicht überstrapazieren mit mir Anfänger. Wenn ich mal mehr Zeit habe und mich noch besser eingelesen habe in AHK komme ich bestimmt noch mal zwecks Hilfestellung. Wenn es jetzt mit Textpad aufging wäre ich schon glücklich.
Hier nur mal ein Vorgeschmack wie die Datei letzlich aussehen muß, damit ich sie in GlobalMapper einlesen kann. Hatte ich in Textpad mit Suchen-Ersetzen und Zeilenumbruch gemacht.
DESCRIPTION=Heli-Aufzeichnung
CLOSED=YES
ID1704260853181
TS0100
FS250
OS2500010F
HELI
TRACK_2
Mi
Apr
26
08:53:18
CEST
2017
C:/data/HeliService/prj/2017/Sachsen/Marienberg/Marien01Ram.prj
4580161.889,5600930.802
4580161.809,5600930.802
4580161.809,5600910.802
4580161.849,5600930.802
4580161.849,5600910.802
4580161.809,5600930.802
4580161.809,5600910.802
4580161.889,5600910.802
DESCRIPTION=Heli-Aufzeichnung
CLOSED=YES
ID1704260855381
TS0100
FS250
OS2500010F
HELI
TRACK_3
Mi
Apr
26
08:55:38
CEST
2017
C:/data/HeliService/prj/2017/Sachsen/Marienberg/Marien01Ram.prj
4580161.7,5600930.986
4580161.688,5600930.986
4580161.688,5600910.986
4580161.704,5600930.986
4580161.704,5600910.986
4580161.688,5600930.986
4580161.688,5600910.986
4580161.7,5600910.986
Re: Zeilen in Text umstellen
z.B. so
Code: Select all
Programm_PathFilename := "C:\program files\some dir\myprogram.exe"
Deine_Textdatei := "D:\some dir\some other dir\Dateiname.txt"
Run, "%Programm_PathFilename%" "%Deine_Textdatei%"
Re: Zeilen in Text umstellen
Hallo,
wollt nur sagen das ich jetzt "fast" alles gelöst habe. Danke noch mal für die Hilfe.
Den Zeilenumbruch habe ich mit "StringReplace, e, e, %A_Space%, `r`n, All " hinbekommen. Gibt es eine Möglichkeit, nur die Leerzeichen innerhalb von zwei geschweiften Klammern durch ein anderes Zeichen zu ersetzten?
Oder den Inhalt zwischen den Klammern vom Zeilenumbruch auszunehmen.
wollt nur sagen das ich jetzt "fast" alles gelöst habe. Danke noch mal für die Hilfe.
Den Zeilenumbruch habe ich mit "StringReplace, e, e, %A_Space%, `r`n, All " hinbekommen. Gibt es eine Möglichkeit, nur die Leerzeichen innerhalb von zwei geschweiften Klammern durch ein anderes Zeichen zu ersetzten?
Oder den Inhalt zwischen den Klammern vom Zeilenumbruch auszunehmen.
Who is online
Users browsing this forum: No registered users and 34 guests