Moin liebe Autohotkeyaner,
ich bin durch die CT wieder zu AHK gestossen. Aktuell nutze ich AHK als bessere Kopierscriptmaschine, um eine Gui für einfache Aufgaben zu haben.
Ich hätte gerne einen Tipp, wie ich eine Datei auslesen kann, wo ich die Werte aus einer Klammer auslese und in einer anderen Datei abspeichere ..
So sieht es aus
Funktion-1 = Aktion(123)
Funktion-8 = Aktion(456)
Funktion-9 = Aktion(1212)
Die Werte "Funktion" und "Aktion" habe ich bisher manuell abgetippt, zentral abgespeichert.
Wie gehe ich idealerweise vor, um den Wert von Aktion zu ermitteln ?
Abspeichern würde ich es mittel fileappend ... , bzw iniwrite
Über eine Hilfe würde ich mich sehr freuen, Danke vorab
Datei, Inhalte von Klammern auslesen
Moderator: jNizM
-
- Posts: 6
- Joined: 07 Feb 2019, 16:41
-
- Posts: 264
- Joined: 09 Mar 2019, 01:52
- Location: Germany
- Contact:
Re: Datei, Inhalte von Klammern auslesen
Irgendwie komme ich mit dem Regex noch nicht ganz klar, deswegen zwei Zeilen mit Regex.
Code: Select all
text =
( LTrim
Funktion-1 = Aktion(123)
Funktion-8 = Aktion(456)
Funktion-9 = Aktion(1212)
)
Loop, parse, text, `n`r
{
RegExMatch(A_LoopField, "\(\d+\)", found)
found := RegExReplace(found,"\(|\)" , "")
MsgBox %found%
}
Re: Datei, Inhalte von Klammern auslesen
Moin Kobaltauge,
eine Lösungsmöglichkeit heißt "Teilmuster/subpattern":Hier ist (\d+) das erste Teilmuster und wird deshalb in M1 abgelegt.
Außerdem:ist nur dann eine gute Wahl, wenn die Zeilen der Datei entweder nur mit `n (Unix) oder nur mit `r (Mac) enden.
Bei Windows Dateien, deren Zeilen normalerweise mit `r`n enden, empfiehlt sich dagegenDen Unterschied bemerkst Du, wenn Du beide Versionen auf
loslässt.
eine Lösungsmöglichkeit heißt "Teilmuster/subpattern":
Code: Select all
If RegExMatch(A_LoopField, "= Aktion\((\d+)\)", M)
{
Aktion := M1
MsgBox, 0, Satz #%A_Index%, Aktion: %Aktion%
}
Außerdem:
Code: Select all
Loop, parse, text, `n`r
Bei Windows Dateien, deren Zeilen normalerweise mit `r`n enden, empfiehlt sich dagegen
Code: Select all
Loop, parse, text, `n, `r ; 4 Parameter
Code: Select all
; Join Parameter!
text =
(LTrim Join`r`n
Funktion-1 = Aktion(123)
Funktion-8 = Aktion(456)
Funktion-9 = Aktion(1212)
)
-
- Posts: 264
- Joined: 09 Mar 2019, 01:52
- Location: Germany
- Contact:
Re: Datei, Inhalte von Klammern auslesen
@just me wow. Vielen Dank für deine Tipps.
Das mit dem "Teilmuster" kenne ich, das verwende ich an einer anderen Stelle, deswegen wollte ich es auch hier anwenden. Aber das funktioniert bei mir nicht (AHK 1.1.30.00). Deswegen habe ich auch die zweite Zeile eingebaut, um die Klammern zu entfernen. Dein Code funktioniert bei mir gar nicht. =(
Das mit dem "Teilmuster" kenne ich, das verwende ich an einer anderen Stelle, deswegen wollte ich es auch hier anwenden. Aber das funktioniert bei mir nicht (AHK 1.1.30.00). Deswegen habe ich auch die zweite Zeile eingebaut, um die Klammern zu entfernen. Dein Code funktioniert bei mir gar nicht. =(
Re: Datei, Inhalte von Klammern auslesen
Moin,
Wenn es einen Treffer gibt, landet der Teil für das Teilmuster (\d+) in Found1.
Found enthält immer den kompletten Treffer.
Code: Select all
RegExMatch(A_LoopField, "= Aktion\((\d+)\)", Found)
Found enthält immer den kompletten Treffer.
-
- Posts: 264
- Joined: 09 Mar 2019, 01:52
- Location: Germany
- Contact:
Re: Datei, Inhalte von Klammern auslesen
@just me wer lesen kann ist klar im Vorteil. Das hattest du doch schon das erste Mal geschrieben. Und wieder was gelernt. Vielen Dank. Ich dachte nur mit RegExReplace gibt es diese Aufteilung in Teilmuster. Das ganze Regex ist mir manchmal ein Buch mit sieben Sigeln.
Wie ich schon erwähnt habe, hatte ich eigentlich eine andere Lösung für @greenhorst. Ich wollte den String per RegExReplace säubern. Aber auch hier verstehe ich nicht, warum $1 in den Zeilen verschieden interpretiert wird. Die gleiche "Needle" nur einmal mit $0 im Ergebnis und einmal nur $1. Eigentlich sollte doch auch im zweiten Fall nur die Zahl erscheinen.
Wie ich schon erwähnt habe, hatte ich eigentlich eine andere Lösung für @greenhorst. Ich wollte den String per RegExReplace säubern. Aber auch hier verstehe ich nicht, warum $1 in den Zeilen verschieden interpretiert wird. Die gleiche "Needle" nur einmal mit $0 im Ergebnis und einmal nur $1. Eigentlich sollte doch auch im zweiten Fall nur die Zahl erscheinen.
Code: Select all
text =
( LTrim
Funktion-1 = Aktion(123)
Funktion-8 = Aktion(456)
Funktion-9 = Aktion(1212)
)
Loop, parse, text, `n`r
{
found := RegExReplace(A_LoopField, "\((\d+)\)", "$0 : $1")
found2 := RegExReplace(A_LoopField, "\((\d+)\)", "$1")
MsgBox %found%`n%found2%
}
-
- Posts: 6
- Joined: 07 Feb 2019, 16:41
Re: Datei, Inhalte von Klammern auslesen
Wow, Danke, freu mich über die Ansätze, Lösungen ... ich für meinem Teil brauche etwas um das umzusetzen, habe aber wieder mehr verstanden, bzgl des RegExReplace Befehls .. mächtiger kleiner Teufel, jetzt versuche ich das morgen mal umzusetzen, Danke ![Smile :-)](./images/smilies/icon_e_smile.gif)
![Smile :-)](./images/smilies/icon_e_smile.gif)
Re: Datei, Inhalte von Klammern auslesen
@Kobaltauge:
Ja, die RegExen haben mir anfänglich auch einige Kopfschmerzen bereitet. Im Laufe der Zeit gewöhnt man sich aber daran und kann immer mehr Probleme damit lösen.
Du lässt hier zwei Mal denselben Text nach demselben Suchbegriff \((\d+)\) durchsuchen. Nur der Ersetzungsteil unterscheidet sich. Der Suchbegriff enthält ein Teilmuster (\d+). Der Regex findet deshalb in beiden Fällen
$0 = (123)
und
$1 = 123.
$0 ist zugleich der Teil der Zeichenkette, der durch die Angaben im Parameter Ersatz ersetzt wird. Die Teile vor bzw. nach dem Gesamttreffer bleiben unverändert.
Der Teil vor dem Treffer ist Funktion-1 = Aktion. Nach dem Treffer gibt es nichts mehr.
Im ersten Fall bildet sich das Ergebnis wie folgt:
Im zweiten Fall dagegen so:
Ja, die RegExen haben mir anfänglich auch einige Kopfschmerzen bereitet. Im Laufe der Zeit gewöhnt man sich aber daran und kann immer mehr Probleme damit lösen.
Code: Select all
Zeile := "Funktion-1 = Aktion(123)"
Repl1 := RegExReplace(Zeile, "\((\d+)\)", "$0 : $1")
Repl2 := RegExReplace(Zeile, "\((\d+)\)", "$1")
$0 = (123)
und
$1 = 123.
$0 ist zugleich der Teil der Zeichenkette, der durch die Angaben im Parameter Ersatz ersetzt wird. Die Teile vor bzw. nach dem Gesamttreffer bleiben unverändert.
Der Teil vor dem Treffer ist Funktion-1 = Aktion. Nach dem Treffer gibt es nichts mehr.
Im ersten Fall bildet sich das Ergebnis wie folgt:
Code: Select all
Text vor dem Treffer + $0 + " : " + $1 + Text nach dem Treffer
"Funktion-1 = Aktion" + "(123)" + " : " + "123" + ""
"Funktion-1 = Aktion(123) : 123"
Code: Select all
Text vor dem Treffer + $1 + Text nach dem Treffer
"Funktion-1 = Aktion" + "123" + ""
"Funktion-1 = Aktion123"
-
- Posts: 6
- Joined: 07 Feb 2019, 16:41
Re: Datei, Inhalte von Klammern auslesen
Puh, ich muss gestehen, das ist für mich noch zu hoch ... habe mir gerade alles findbare zu RegexReplace angetan, es liest sich "mächtig", aber für mich aktuell zu viel. Ich versuche das, was ich verstanden habe, irgendwie umzusetzen, versuche es parallel auch mit InStr ... aktuell wähle ich die einzulesende Textdatei aus und haue dann umständlich drauf los, um es auszulesen. Hab jetzt festegesetllt, das ich auch Dateien habe, wo es öfters Klammern gibt, die nicht benötigt werden, leider übersehen, also muss ich den Inhalt von Aktion( ... ) auslesen, daran versuche ich mich jetzt mal, gut das es nicht zu warm ist .... Danke
Natürlich lusche ich zu den regex befehlen weiter rüber, ist aber doch ne grössere Geschichte
Natürlich lusche ich zu den regex befehlen weiter rüber, ist aber doch ne grössere Geschichte
-
- Posts: 264
- Joined: 09 Mar 2019, 01:52
- Location: Germany
- Contact:
Re: Datei, Inhalte von Klammern auslesen
@greenhorst meine erste Lösung ist zwar umständlicher, aber sie liest immer den Inhalt in den Klammern aus. Das sollte dich weiterbringen.
-
- Posts: 264
- Joined: 09 Mar 2019, 01:52
- Location: Germany
- Contact:
Re: Datei, Inhalte von Klammern auslesen
@just me nochmals vielen vielen Dank. Ich habe zwar immer noch ein wenig gebraucht das in meinen Kopf zu bekommen, aber deine Erklärung ist super. Schade das man hier keine Karmapunkte vergeben kann oder dir einen Kaffee spendieren.
Re: Datei, Inhalte von Klammern auslesen
Hallo Kobaltauge,
ich nehme den virtuellen Kaffee!![Wink ;)](./images/smilies/icon_e_wink.gif)
ich nehme den virtuellen Kaffee!
![Wink ;)](./images/smilies/icon_e_wink.gif)
-
- Posts: 6
- Joined: 07 Feb 2019, 16:41
Re: Datei, Inhalte von Klammern auslesen
Moin, ich erneut, den Kaffee gebe ich gerne aus ![Smile :-)](./images/smilies/icon_e_smile.gif)
Versuche gerade das umzusetzen, bin bei dem Beispiel von Kobaltauge ..
Aktuell .... ich lese über
Loop, read, datei_mit_inhalt, test2.txt
{
IfInString, A_LoopReadLine, TASK(, FileAppend, %A_LoopReadLine%`n
wort_array := StrSplit(A_LoopReadLine, ")")
}
Die Ursprungsdatei ein.
Ich filtere aus der Datei die Zeilen aus, die ich benötige:
Leider habe ich erst jetzt bemerkt, das es mehrere Klammern in einer Zeile gibt ich benötige aber nur Aktion(x)
Funktion-1 = Aktion(123) Quatsch(irgendwas) Quatsch(irgendwas)
Funktion-8 = Aktion(456)
Funktion-9 = Aktion(1212) Quatsch(irgendwas) Quatsch(irgendwas)
Dann lese ich die Daten über
FileRead, text,text2.txt
Loop, parse, text, `n`r
{
RegExMatch(A_LoopField, "\(\d+\)", found)
found := RegExReplace(found,"\(|\)" , "")
MsgBox %found%
}
wieder ein .....
Dachte ich zumindestens .. jedenfalls sitze ich jetzt schon länger hier und ... nix
Idee ... ?
Ursprungsidee, Datei einlesen, alle Werte, die in Aktion() stehen in eine Extradatei zu exportieren ..
Freundliches müde .. Hilfe,
![Smile :-)](./images/smilies/icon_e_smile.gif)
Versuche gerade das umzusetzen, bin bei dem Beispiel von Kobaltauge ..
Aktuell .... ich lese über
Loop, read, datei_mit_inhalt, test2.txt
{
IfInString, A_LoopReadLine, TASK(, FileAppend, %A_LoopReadLine%`n
wort_array := StrSplit(A_LoopReadLine, ")")
}
Die Ursprungsdatei ein.
Ich filtere aus der Datei die Zeilen aus, die ich benötige:
Leider habe ich erst jetzt bemerkt, das es mehrere Klammern in einer Zeile gibt ich benötige aber nur Aktion(x)
Funktion-1 = Aktion(123) Quatsch(irgendwas) Quatsch(irgendwas)
Funktion-8 = Aktion(456)
Funktion-9 = Aktion(1212) Quatsch(irgendwas) Quatsch(irgendwas)
Dann lese ich die Daten über
FileRead, text,text2.txt
Loop, parse, text, `n`r
{
RegExMatch(A_LoopField, "\(\d+\)", found)
found := RegExReplace(found,"\(|\)" , "")
MsgBox %found%
}
wieder ein .....
Dachte ich zumindestens .. jedenfalls sitze ich jetzt schon länger hier und ... nix
Idee ... ?
Ursprungsidee, Datei einlesen, alle Werte, die in Aktion() stehen in eine Extradatei zu exportieren ..
Freundliches müde .. Hilfe,
Re: Datei, Inhalte von Klammern auslesen
just me wrote: Moin Kobaltauge,
eine Lösungsmöglichkeit heißt "Teilmuster/subpattern":Hier ist (\d+) das erste Teilmuster und wird deshalb in M1 abgelegt.Code: Select all
If RegExMatch(A_LoopField, "= Aktion\((\d+)\)", M) { Aktion := M1 MsgBox, 0, Satz #%A_Index%, Aktion: %Aktion% }
Außerdem:ist nur dann eine gute Wahl, wenn die Zeilen der Datei entweder nur mit `n (Unix) oder nur mit `r (Mac) enden.Code: Select all
Loop, parse, text, `n`r
Bei Windows Dateien, deren Zeilen normalerweise mit `r`n enden, empfiehlt sich dagegenDen Unterschied bemerkst Du, wenn Du beide Versionen aufCode: Select all
Loop, parse, text, `n, `r ; 4 Parameter
loslässt.Code: Select all
; Join Parameter! text = (LTrim Join`r`n Funktion-1 = Aktion(123) Funktion-8 = Aktion(456) Funktion-9 = Aktion(1212) )
Moin greenhorst,
schau Dir mal meine Vorschläge genauer an. Die Änderungen sollten Dich weiter bringen. Aus der NadelRegEx im RegExMatch() kannst Du bei Bedarf noch das führende = (hinter dem = folgt ein Leerzeichen) entfernen.
Who is online
Users browsing this forum: No registered users and 9 guests