Zeilen in Text umstellen

Stelle Fragen zur Programmierung mit Autohotkey

Moderator: jNizM

Raffel
Posts: 22
Joined: 07 Jan 2016, 08:43

Zeilen in Text umstellen

01 Oct 2017, 12:26

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
User avatar
nnnik
Posts: 4500
Joined: 30 Sep 2013, 01:01
Location: Germany

Re: Zeilen in Text umstellen

01 Oct 2017, 13:11

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
Recommends AHK Studio
Raffel
Posts: 22
Joined: 07 Jan 2016, 08:43

Re: Zeilen in Text umstellen

02 Oct 2017, 01:50

Oje, klingt kompliziert. da muß ich mich erst mal rein lesen in den Weiten des www.
Danke erstmal.
BoBo
Posts: 6564
Joined: 13 May 2014, 17:15

Re: Zeilen in Text umstellen

03 Oct 2017, 12:57

Nicht wirklich kompliziert.
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
Nicht getestet.
Raffel
Posts: 22
Joined: 07 Jan 2016, 08:43

Re: Zeilen in Text umstellen

07 Oct 2017, 09:03

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.
just me
Posts: 9490
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Zeilen in Text umstellen

07 Oct 2017, 09:28

Was hast Du denn versucht, und was funktioniert an BoBos Code nicht so, wie Du es willst?
Raffel
Posts: 22
Joined: 07 Jan 2016, 08:43

Re: Zeilen in Text umstellen

07 Oct 2017, 09:37

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 ?
User avatar
nnnik
Posts: 4500
Joined: 30 Sep 2013, 01:01
Location: Germany

Re: Zeilen in Text umstellen

07 Oct 2017, 09:49

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
Raffel
Posts: 22
Joined: 07 Jan 2016, 08:43

Re: Zeilen in Text umstellen

07 Oct 2017, 13:22

Wenn ich jetzt mein Versuch hochlade, bitte nicht lachen :lolno:
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
BoBo
Posts: 6564
Joined: 13 May 2014, 17:15

Re: Zeilen in Text umstellen

07 Oct 2017, 13:57

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.
garry
Posts: 3776
Joined: 22 Dec 2013, 12:50

Re: Zeilen in Text umstellen

07 Oct 2017, 15:36

Beispiel-1

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
;===========================================================
Beispiel-2 mit FileSelect

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.
Raffel
Posts: 22
Joined: 07 Jan 2016, 08:43

Re: Zeilen in Text umstellen

08 Oct 2017, 05:46

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
just me
Posts: 9490
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Zeilen in Text umstellen

08 Oct 2017, 06:29

Ja!
garry
Posts: 3776
Joined: 22 Dec 2013, 12:50

Re: Zeilen in Text umstellen

08 Oct 2017, 07:40

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%

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
;....   
Raffel
Posts: 22
Joined: 07 Jan 2016, 08:43

Re: Zeilen in Text umstellen

08 Oct 2017, 10:28

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

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
just me
Posts: 9490
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Zeilen in Text umstellen

08 Oct 2017, 10:58

Code: Select all

fileread,aa,%filename%
Der Dateiinhalt steht in der Variablen aa. Die kannst Du sowohl als Input- wie auch als OutputVar einsetzen. Warum willst Du die Zeilen überhaupt behalten?

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
Noch eine Anmerkung:
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.
garry
Posts: 3776
Joined: 22 Dec 2013, 12:50

Re: Zeilen in Text umstellen

08 Oct 2017, 11:53

@just me , danke
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
*/

;===========================================================
Raffel
Posts: 22
Joined: 07 Jan 2016, 08:43

Re: Zeilen in Text umstellen

08 Oct 2017, 12:51

Hat super geklappt. mein Script sieht jetzt so aus

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
Margarethe

Re: Zeilen in Text umstellen

08 Oct 2017, 13:53

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%"
Raffel
Posts: 22
Joined: 07 Jan 2016, 08:43

Re: Zeilen in Text umstellen

12 Oct 2017, 04:39

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.

Return to “Ich brauche Hilfe”

Who is online

Users browsing this forum: No registered users and 34 guests