Datei, Inhalte von Klammern auslesen

Stelle Fragen zur Programmierung mit Autohotkey

Moderator: jNizM

greenhorst
Posts: 6
Joined: 07 Feb 2019, 16:41

Datei, Inhalte von Klammern auslesen

02 May 2019, 15:50

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
Kobaltauge
Posts: 264
Joined: 09 Mar 2019, 01:52
Location: Germany
Contact:

Re: Datei, Inhalte von Klammern auslesen

03 May 2019, 03:45

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

Re: Datei, Inhalte von Klammern auslesen

03 May 2019, 04:02

Moin Kobaltauge,

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%
   }
Hier ist (\d+) das erste Teilmuster und wird deshalb in M1 abgelegt.

Außerdem:

Code: Select all

Loop, parse, text, `n`r
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 dagegen

Code: Select all

Loop, parse, text, `n, `r  ; 4 Parameter
Den Unterschied bemerkst Du, wenn Du beide Versionen auf

Code: Select all

; Join Parameter!
text =
(LTrim Join`r`n
Funktion-1 = Aktion(123)
Funktion-8 = Aktion(456)
Funktion-9 = Aktion(1212)
)
loslässt.
Kobaltauge
Posts: 264
Joined: 09 Mar 2019, 01:52
Location: Germany
Contact:

Re: Datei, Inhalte von Klammern auslesen

03 May 2019, 04:37

@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.
2019-05-03 11_32_08-AHK Studio - Z__programmier_autohotkey_regex_klammer.ahk.png
2019-05-03 11_32_08-AHK Studio - Z__programmier_autohotkey_regex_klammer.ahk.png (12.61 KiB) Viewed 2895 times
Dein Code funktioniert bei mir gar nicht. =(
just me
Posts: 9424
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Datei, Inhalte von Klammern auslesen

03 May 2019, 06:09

Moin,

Code: Select all

   RegExMatch(A_LoopField, "= Aktion\((\d+)\)", Found)
Wenn es einen Treffer gibt, landet der Teil für das Teilmuster (\d+) in Found1.
Found enthält immer den kompletten Treffer.
Kobaltauge
Posts: 264
Joined: 09 Mar 2019, 01:52
Location: Germany
Contact:

Re: Datei, Inhalte von Klammern auslesen

03 May 2019, 12:04

@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.
Zwischenablage02.jpg
Zwischenablage02.jpg (24.59 KiB) Viewed 2864 times

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%
}
greenhorst
Posts: 6
Joined: 07 Feb 2019, 16:41

Re: Datei, Inhalte von Klammern auslesen

03 May 2019, 15:10

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

Re: Datei, Inhalte von Klammern auslesen

04 May 2019, 02:49

@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.

Code: Select all

Zeile := "Funktion-1 = Aktion(123)"
Repl1 := RegExReplace(Zeile, "\((\d+)\)", "$0 : $1")
Repl2 := RegExReplace(Zeile, "\((\d+)\)", "$1")
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:

Code: Select all

Text vor dem Treffer  + $0      + " : " + $1    + Text nach dem Treffer
"Funktion-1 = Aktion" + "(123)" + " : " + "123" + ""
"Funktion-1 = Aktion(123) : 123"
Im zweiten Fall dagegen so:

Code: Select all

Text vor dem Treffer  + $1    + Text nach dem Treffer
"Funktion-1 = Aktion" + "123" + ""
"Funktion-1 = Aktion123"
greenhorst
Posts: 6
Joined: 07 Feb 2019, 16:41

Re: Datei, Inhalte von Klammern auslesen

04 May 2019, 04:48

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
Kobaltauge
Posts: 264
Joined: 09 Mar 2019, 01:52
Location: Germany
Contact:

Re: Datei, Inhalte von Klammern auslesen

04 May 2019, 10:02

@greenhorst meine erste Lösung ist zwar umständlicher, aber sie liest immer den Inhalt in den Klammern aus. Das sollte dich weiterbringen.
Kobaltauge
Posts: 264
Joined: 09 Mar 2019, 01:52
Location: Germany
Contact:

Re: Datei, Inhalte von Klammern auslesen

04 May 2019, 10:04

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

Re: Datei, Inhalte von Klammern auslesen

04 May 2019, 10:17

Hallo Kobaltauge,

ich nehme den virtuellen Kaffee! ;)
greenhorst
Posts: 6
Joined: 07 Feb 2019, 16:41

Re: Datei, Inhalte von Klammern auslesen

05 May 2019, 16:15

Moin, ich erneut, den Kaffee gebe ich gerne aus :-)

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

Re: Datei, Inhalte von Klammern auslesen

06 May 2019, 04:49

just me wrote: Moin Kobaltauge,

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%
   }
Hier ist (\d+) das erste Teilmuster und wird deshalb in M1 abgelegt.

Außerdem:

Code: Select all

Loop, parse, text, `n`r
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 dagegen

Code: Select all

Loop, parse, text, `n, `r  ; 4 Parameter
Den Unterschied bemerkst Du, wenn Du beide Versionen auf

Code: Select all

; Join Parameter!
text =
(LTrim Join`r`n
Funktion-1 = Aktion(123)
Funktion-8 = Aktion(456)
Funktion-9 = Aktion(1212)
)
loslässt.

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.

Return to “Ich brauche Hilfe”

Who is online

Users browsing this forum: No registered users and 19 guests