Text zwischen bestimmten Zeilen verändern

Stelle Fragen zur Programmierung mit Autohotkey

Moderator: jNizM

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

Text zwischen bestimmten Zeilen verändern

17 Oct 2017, 12:59

Hallo,
ich mal wieder. Nachdem ich hier mit eurer Hilf schon etwas gelernt habe, bin ich beim nächsten Projekt. Es geht um Nmea-log Dateien die ich mit AHK schon umgestellt habe. Ich habe schon ein fertiges Script, wo allerdings die letzten Schritte
mit Textpad ablaufen. Bei bis zu 60mb pro File muss ich allerdings Sleep, 35000 einstellen :lolno:
Der letzte Schritt den ich nicht in Ahk hinbekomme ist dieses Beispiel

So sieht es aus:

Ventil zu
N50.5386567 E013.1293467 25-AUG-17 09:11:10 667
N50.5386550 E013.1293283 25-AUG-17 09:11:10 667
N50.5386550 E013.1293067 25-AUG-17 09:11:11 667
Ventil auf
N50.5386533 E013.1292850 25-AUG-17 09:11:11 667
N50.5386517 E013.1292600 25-AUG-17 09:11:12 668
N50.5386517 E013.1292350 25-AUG-17 09:11:12 668
Ventil zu
N50.5386517 E013.1292100 25-AUG-17 09:11:13 668
N50.5386533 E013.1291867 25-AUG-17 09:11:13 668
N50.5386550 E013.1291617 25-AUG-17 09:11:14 668
N50.5386567 E013.1291333 25-AUG-17 09:11:14 668

So soll es aussehen

Ventil zu
{N50.5386567 E013.1293467 25-AUG-17 09:11:10 667}
{N50.5386550 E013.1293283 25-AUG-17 09:11:10 667}
{N50.5386550 E013.1293067 25-AUG-17 09:11:11 667}
Ventil auf
N50.5386533 E013.1292850 25-AUG-17 09:11:11 667
N50.5386517 E013.1292600 25-AUG-17 09:11:12 668
N50.5386517 E013.1292350 25-AUG-17 09:11:12 668
Ventil zu
{N50.5386517 E013.1292100 25-AUG-17 09:11:13 668}
{N50.5386533 E013.1291867 25-AUG-17 09:11:13 668}
{N50.5386550 E013.1291617 25-AUG-17 09:11:14 668}
{N50.5386567 E013.1291333 25-AUG-17 09:11:14 668}

Die Idee dahinter, ist in zwei Schritten erst die Zeilen zwischen zu und auf in Klammer zu setzen (egal welche) um dann mit RegExReplace(aa, "{.*?}", "${0} zu") ein "zu" dahinter zu schreiben. Dann die Klammern zu löschen und das gleiche
noch mal von auf bis zu und mit auf ersetzen.
Gibt es da irgendeine Lösung? Und wenn, wie kann ich vorher ans Ende eine letzte Zeile einfügen mit Ventil zu, damit auch diese eine Klammer bekommen.
BoBo
Posts: 6564
Joined: 13 May 2014, 17:15

Re: Text zwischen bestimmten Zeilen verändern

18 Oct 2017, 11:28

Sorry, kein RegEx ...

Code: Select all

Loop, Read, Nmea.log
{
If InStr(A_LoopReadLine,"Ventil zu") {
   sol := "{"
   eol := "}`n"
   line .= A_LoopReadLine "`n"
   Continue
   }
If InStr(A_LoopReadLine,"Ventil auf") {
   sol := ""
   eol := "`n"
   line .= A_LoopReadLine "`n"
   Continue
   }
Else
   line .= sol . A_LoopReadLine . eol
}
MsgBox % line
Nicht getestet (da aktuell unter iOS).
Raffel
Posts: 22
Joined: 07 Jan 2016, 08:43

Re: Text zwischen bestimmten Zeilen verändern

18 Oct 2017, 13:51

Hallo Bobo,
In der Msg-Box siehtes erst mal super aus. Ich kämpfe noch wie ich das in eine Datei schreibe mit fileappend
garry
Posts: 3736
Joined: 22 Dec 2013, 12:50

Re: Text zwischen bestimmten Zeilen verändern

18 Oct 2017, 14:49

betreff fileappend , ersetze `n mit `r`n

Code: Select all

f1=%a_scriptdir%\nmea.log
f2=%a_scriptdir%\test55.txt
ifnotexist,%f1%
{
d=
(Ltrim Join`r`n
Ventil zu
N50.5386567 E013.1293467 25-AUG-17 09:11:10 667
N50.5386550 E013.1293283 25-AUG-17 09:11:10 667
N50.5386550 E013.1293067 25-AUG-17 09:11:11 667
Ventil auf
N50.5386533 E013.1292850 25-AUG-17 09:11:11 667
N50.5386517 E013.1292600 25-AUG-17 09:11:12 668
N50.5386517 E013.1292350 25-AUG-17 09:11:12 668
Ventil zu
N50.5386517 E013.1292100 25-AUG-17 09:11:13 668
N50.5386533 E013.1291867 25-AUG-17 09:11:13 668
N50.5386550 E013.1291617 25-AUG-17 09:11:14 668
N50.5386567 E013.1291333 25-AUG-17 09:11:14 668
)
fileappend,%d%,%f1%
d=
}

Loop, Read,%f1%
{
If InStr(A_LoopReadLine,"Ventil zu") {
   sol := "{"
   eol := "}`r`n"
   line .= A_LoopReadLine "`r`n"
   Continue
   }
If InStr(A_LoopReadLine,"Ventil auf") {
   sol := ""
   eol := "`r`n"
   line .= A_LoopReadLine "`r`n"
   Continue
   }
Else
   line .= sol . A_LoopReadLine . eol
}
MsgBox % line
fileappend,%line%,%f2%
run,%f2%
return
Raffel
Posts: 22
Joined: 07 Jan 2016, 08:43

Re: Text zwischen bestimmten Zeilen verändern

19 Oct 2017, 04:11

Hallo,
So alles geschafft. Vielen,vielen Dank nochmal.
Wenn ihr mal viel Zeit habt, oder lange Weile würde ich mich über eine Erklärung warum dieser
Code das macht was er soll :!: Dieses "sol" oder "eol" was hat das zu bedeuten? Wills nur gerne mal verstehen.
If InStr(A_LoopReadLine,"Ventil zu") {
sol := "{"
eol := "}`n"
line .= A_LoopReadLine "`n"
Continue
}
If InStr(A_LoopReadLine,"Ventil auf") {
sol := ""
eol := "`n"
line .= A_LoopReadLine "`n"
Continue
}
Else
line .= sol . A_LoopReadLine . eol

Das Script sieht jetzt so aus. Könnte man bestimmt noch verbessern, aber Hauptsache es geht

Code: Select all

f2=%a_scriptdir%\log-neu.txt
aa1=%a_desktop%                        ;- search file from here
FileSelectFile, filename,1,%aa1%,Datei auswählen,*.log
if filename =
   return
fileread,aa,%filename%

StringReplace, aa, aa, ----------------------------------------------------- ,, All    ;löscht unnötige Einträge
StringReplace, aa, aa, Ventil auf, $GPGGA`,000000.000`,5026.5520`,N`,01235.4709`,E`,1`,07`,0.9`,933.3`,M`,46.9`,Ventil auf, All  ; setzt Event wenn auf
StringReplace, aa, aa, Ventil zu, $GPGGA`,000001.000`,5026.5520`,N`,01235.4709`,E`,1`,07`,0.9`,933.3`,M`,46.9`,Ventil zu, All   ;setzt Event wenn zu
if aa<>
{
  ifnotexist,%f2%
  fileappend,%aa%,%f2%
  aa=
 run, "D:\Programme\Gis_GPS\GPS-Konverter\GPS-Format-Konverter\GPSFormatKonverter.exe" "%f2%"  ;starte GPS Formatkonverter
 Sleep, 200
WinWait, GPS-Format-Konverter V1.24 ALPHA 8, 
IfWinNotActive, GPS-Format-Konverter V1.24 ALPHA 8, , WinActivate, GPS-Format-Konverter V1.24 ALPHA 8, 
WinWaitActive, GPS-Format-Konverter V1.24 ALPHA 8, 
Send, {CTRLDOWN}s{CTRLUP}{CTRLUP}{ENTER}   ;Speichert Datei (Garmin)
WinWait, Zieldatei speichern, 
IfWinNotActive, Zieldatei speichern, , WinActivate, Zieldatei speichern, 
WinWaitActive, Zieldatei speichern,
Sleep, 100
Send, {Enter}
Sleep, 200
MouseClick, left,  27,  35
Sleep, 100
MouseClick, left,  71,  230  ;schliesst Formatconverter
Sleep, 500
FileDelete, C:\Users\User\Desktop\log-neu.txt
fileread, aa, C:\Users\User\Desktop\log-neu.grm
string := "(.*00:00:00.*)"
aa := RegExReplace(aa, string, "Ventil auf")   			;ersetzt ganze Zeile (Uhrzeit 0000) mit Ventil auf
Sleep, 200
string := "(.*00:00:01.*)"
aa := RegExReplace(aa, string, "Ventil zu")  			;ersetzt ganze Zeile (Uhrzeit(0001) mit Ventil auf
StringReplace, aa, aa, T%A_Space%%A_Space%,, All  		;löscht T am Anfang von Zeile
StringReplace, aa, aa, H%A_Space%%A_Space%,, All		;löscht H am Anfang von Zeile
StringReplace, aa, aa, `;track,, All				;löscht track in Zeile
StringReplace, aa, aa, Al, Alt, All				;macht aus Al Alt
Sleep, 200
string := "(.*LATITUDE.*)"					;macht aus Kopfzeile Ventil zu
aa := RegExReplace(aa, string, "Ventil zu")

if aa<>
{
filedelete, C:\Users\User\Desktop\log-neu.grm
  fileappend,%aa%, C:\Users\User\Desktop\log-neu.grm
  aa=
  }
  Sleep, 100
 RemoveLines(filename, startingLine, numOfLines){		 ;löscht die oberen unnötigen Zeilen (13)
         Loop, Read, C:\Users\User\Desktop\log-neu.grm
                 if ( A_Index < StartingLine )
                         || ( A_Index >= StartingLine + numOfLines )
                                 ret .= "`r`n" . A_LoopReadLine
         FileDelete, % Filename
         FileAppend, % SubStr(ret, 3), % Filename
  }
    SetWorkingDir, % A_ScriptDir
RemoveLines("C:\Users\User\Desktop\log.txt", 1, 13)
Sleep, 200
FileDelete, C:\Users\User\Desktop\log-neu.grm
}
Loop, Read, C:\Users\User\Desktop\log.txt, log1.txt		
{
If InStr(A_LoopReadLine,"Ventil zu") {				;setzt Klammern{} in jede Zeile zwischen Ventil zu und auf
   sol := "{"
   eol := "}`n"
   line .= A_LoopReadLine "`n"
   Continue
   
   }
If InStr(A_LoopReadLine,"Ventil auf") {				;setzt Klammern () in jede Zeile zwischen Ventil auf und zu
   sol := "("
   eol := ")`n"
   line .= A_LoopReadLine "`n"
   Continue
   }
Else
   line .= sol . A_LoopReadLine . eol
}
;MsgBox % line 
{
FileDelete, C:\Users\User\Desktop\log.txt
FileAppend, %line% `n, log1.txt					;speichert den Loop mit Klammern
 }
fileread, aa, C:\Users\User\Desktop\log1.txt 
StringReplace, aa, aa, `{,, All					;löscht voerderste Klammer {
StringReplace, aa, aa, `}, %A_Space%off, All			;ersetzt hintere Klammer } mit off
Sleep,200
StringReplace, aa, aa, `(,, All					;löscht vorderste Klammer (
StringReplace, aa, aa, `), %A_Space%on, All			;erstzt nintere Klammer ) mit on
string := "(.*Ventil.*)"					;löscht alle Einträge mit Ventil
aa := RegExReplace(aa, string, "")
fileappend,%aa%, C:\Users\User\Desktop\log.txt
FileDelete, C:\Users\User\Desktop\log1.txt
run, "D:\Programme\Office\Textpad\Textpad.exe" "C:\Users\User\Desktop\log.txt", max
WinWait, TextPad - C:\Users\User\Desktop\log.txt, 
IfWinNotActive, TextPad - C:\Users\User\Desktop\log.txt, , WinActivate, TextPad - C:\Users\User\Desktop\log.txt, 
WinWaitActive, TextPad - C:\Users\User\Desktop\log.txt,

Send, {F12}							;Datei unter neuen Namen,Ordner speichern
Sleep, 200
FileRecycle, C:\Users\User\Desktop\log.txt			;schiebt Datei in Papierkorb

return
BoBo
Posts: 6564
Joined: 13 May 2014, 17:15

Re: Text zwischen bestimmten Zeilen verändern

19 Oct 2017, 04:26

Im englischen wird das zeilenende-zeichen als "end-of-line"-character (eol) bezeichnet. Was könnte demnach "sol" heißen? :)

BTW, warum setzt du erst klammern, um diese dann anschließend durch on/off zu ersetzen???
Raffel
Posts: 22
Joined: 07 Jan 2016, 08:43

Re: Text zwischen bestimmten Zeilen verändern

19 Oct 2017, 05:55

Hallo Bobo,
Experimentiere gerade mit deinem Script und habe schon gemerkt das ich das für meine Zwecke noch verfeinern kann. Die Klammern werde ich noch weglassen. Kann die Ereignisse ja gleich reinschreiben. Wird langsam.
Gleich nochmal eine Frage. Kann man mit LoopReadLine auch rückwärts suchen?
Raffel
Posts: 22
Joined: 07 Jan 2016, 08:43

Re: Text zwischen bestimmten Zeilen verändern

19 Oct 2017, 14:16

Ich noch mal mit letzter Baustelle.. Mit den einzelnen Koordinatenpunkten zu markieren hat es super geklappt. Teilweise muss ich die Daten auch als Linie einlesen. Da brauche ich nur Auf/Zu (sonst geht die dbf-Datei in die Knie)
Kurz und knapp, kann man auch nur in die erste und letzte Zeile zwischen den Ereignissen was schreiben. Muss ja keine Klammer sein. Nur in die erste, habe ich ja schon hinbekommen, aber die letzte keine Chance für mich.
Beispiel:
Ventil zu
{N50.5386567 E013.1293467 25-AUG-17 09:11:10 667}
N50.5386550 E013.1293283 25-AUG-17 09:11:10 667
{N50.5386550 E013.1293067 25-AUG-17 09:11:11 667}
Ventil auf
(N50.5386533 E013.1292850 25-AUG-17 09:11:11 667)
N50.5386517 E013.1292600 25-AUG-17 09:11:12 668
(N50.5386517 E013.1292350 25-AUG-17 09:11:12 668)
Ventil zu
{N50.5386517 E013.1292100 25-AUG-17 09:11:13 668}
N50.5386533 E013.1291867 25-AUG-17 09:11:13 668
N50.5386517 E013.1292100 25-AUG-17 09:11:13 668
{N50.5386533 E013.1291867 25-AUG-17 09:11:13 668}
BoBo
Posts: 6564
Joined: 13 May 2014, 17:15

Re: Text zwischen bestimmten Zeilen verändern

20 Oct 2017, 03:08

Ich würde mir folgendes wünschen - du beschreibst (zukünftig) was du generell vorhast z.b. ...


a) "automatische konvertierung einer datei x im format y in das format z ...
b) manuell verwende ich dazu aktuell programm a und b ...
c) anbei (zum download) zwei bespieldateien. Datei A im ursprungsformat vor konvertierung. Datei B im zielformat nach konvertierung. ...
d) meine requirements/spezifikationen (z.b. kann nur d,e,f benutzen da firmen-policy etc, pp)"
e) ... ?

Warum schlage ich dies vor (zumal dein projekt schon fortgeschritten ist)?

Bei dem von dir bereitgestellten code arbeiten wir aktuell gemeinsam an der beseitigung einzelner probleme (symptome). Was mir dabei fehlt, ist das wissen um den final gesuchten zustand, das ziel. Im moment kommts mir vor als würd ich beim bootsbau helfen und der kumpel sagt einem nach monaten, das es nur darum geht überzusetzen, anstatt ans meer zu fahren. Dies vorab gewußt, hätten wir vorgeschlagen die brücke 100m flussabwärts zu nehmen. Oder anstatt einzelne ruder zu schnitzen, den motor vom opa zu leihen.

Äh, hab ich schon angemerkt das ich metaphern liebe :mrgreen:

PS. bitte stelle mal die genannten dateien als attachment zu deinem nächsten posting zur verfügung.
Raffel
Posts: 22
Joined: 07 Jan 2016, 08:43

Re: Text zwischen bestimmten Zeilen verändern

20 Oct 2017, 04:21

log-Linie-vorher.txt
(85.38 KiB) Downloaded 59 times
log-Linie-fertig.txt
(47.56 KiB) Downloaded 53 times
Ok, Rüge angenommen :o
Im Attachments zwei Dateien. "vorher" bis dahin bin ich mit AHK.
"fertig" so muß es mal aussehen.
Danke für die Mühe.
BoBo
Posts: 6564
Joined: 13 May 2014, 17:15

Re: Text zwischen bestimmten Zeilen verändern

20 Oct 2017, 06:08

War nicht als 'Rüge' gedacht, eher als konstruktiver vorschlag. Danke fürs posten der dateien :thumbup:
FYI - da ich aktuell 'technisch' gehandicaped bin (NoBo tot), kann ich derzeit nur im ansatz mitwirken (keine testmöglichkeit auf iOS).

"... bis dahin bin ich mit AHK" ... bedeutet demnach NICHT, das dies die im urformat vorliegende datei wäre, wobei zudem aus deinem script ersichtlich ist, das du einen nicht näher genannten konverter einsetzt?!
BoBo
Posts: 6564
Joined: 13 May 2014, 17:15

Re: Text zwischen bestimmten Zeilen verändern

20 Oct 2017, 08:20

Für etwaige supporter. (editierte) Auszüge aus ...

logline-vorher.txt

Code: Select all

DESCRIPTION=rote Linie
N50.6898750 E012.9629633 13-SEP-17-05:59:22-647
N50.6900683 E012.9630750 13-SEP-17-05:59:22-648
N50.6925850 E012.9642950 13-SEP-17-05:59:29-646
logline-fertig.txt

Code: Select all

DESCRIPTION=rote Linie
N50.6898750 E012.9629633 Beginn=13-SEP-17-05:59:22-647
N50.6900683 E012.9630750
N50.6925850 E012.9642950 Ende=13-SEP-17-05:59:29-646
Raffel
Posts: 22
Joined: 07 Jan 2016, 08:43

Re: Text zwischen bestimmten Zeilen verändern

20 Oct 2017, 09:22

Hallo Bobo,
Das Urformat, mal ein Auszug im Anhang.Können manchmal bis 1 Million Zeilen sein. Der Konverter wandelt mir die Koordinaten, Zeit und Höhe lesbar um. Vorher setze ich das Event (Ventilstellung) noch als
$GPGGA-Zeile mi Uhrzeit 00 bzw 01 ein damit sie mitgeschrieben werden. Ich denke das ich den Konverter mal weglassen kann. da brauche ich aber bestimmt noch einen Winter zum lernen mit AHK :)
Attachments
Urformat.log
(16.25 KiB) Downloaded 49 times
Raffel
Posts: 22
Joined: 07 Jan 2016, 08:43

Re: Text zwischen bestimmten Zeilen verändern

23 Oct 2017, 01:50

Hallo
Wollt nur sagen das es doch keinen Winter gedauert hat, sondern nur das Wochenende.
Den Konverter brauch ich nicht mehr, stelle die Nmea-Dateien direkt in Ahk um. Kn/h gleich noch mit.
Zeitersparnis ca. 80%. Juhu

Return to “Ich brauche Hilfe”

Who is online

Users browsing this forum: No registered users and 28 guests