Doppelte Zeichen aus Variable Entfernen Topic is solved

Stelle Fragen zur Programmierung mit Autohotkey

Moderator: jNizM

UnReALiTyy
Posts: 143
Joined: 06 Jun 2017, 11:38

Doppelte Zeichen aus Variable Entfernen

08 Jan 2020, 11:39

Hey ich brauche mal eure hilfe.
Und zwar möchte ich Doppelte Zeichen aus einer Variable entfernen, diese ist immer in unterschiedlicher länge.
Beispiel:

Code: Select all

test := "1,2,3,a,b,c,a,b,c,1,2,3,c,b,a,2,3,1,"
Hier sollte am Ende 1,2,3,a,b,c stehen alles andere soll entfernt werden.
Die Sortierung soll aber nicht geändert werden!
Das Beispiel kann auch ohne Kommas genommen werden falls dies einfacher wäre.

Mit StrReplace schaffe ich es nur einmal zu entfernen oder halt alle wenn ich es als Loop ausführe.
Wenn möglich sollte das linke Zeichen also das aller erste nicht entfernt werden, also alle Zeichen erst ab dem 2 entfernen.
Vermutlich ist dies mit Loop, Parse, test möglich aber ich habe echt keine ahnung wie genau ich das umsetzen soll.
Ist wohl schwerer als ich am Anfang dachte und ich hoffe jemand kann mir helfen oder mir zumindest einen Tipp geben.
KHA
Posts: 198
Joined: 21 Aug 2018, 11:11

Re: Doppelte Zeichen aus Variable Entfernen  Topic is solved

08 Jan 2020, 15:06

Meinst du vielleicht sowas?

Code: Select all

test := "1,2,3,a,b,c,a,b,c,1,2,3,c,b,a,2,3,1,"
Liste := ""

Loop, parse, test, `,
{
	If !InStr(Liste, A_LoopField)
	Liste .= A_LoopField ","

}
MsgBox, % Liste
UnReALiTyy
Posts: 143
Joined: 06 Jun 2017, 11:38

Re: Doppelte Zeichen aus Variable Entfernen

08 Jan 2020, 16:58

KHA wrote:
08 Jan 2020, 15:06
Meinst du vielleicht sowas?

Code: Select all

test := "1,2,3,a,b,c,a,b,c,1,2,3,c,b,a,2,3,1,"
Liste := ""

Loop, parse, test, `,
{
	If !InStr(Liste, A_LoopField)
	Liste .= A_LoopField ","

}
MsgBox, % Liste
Hey Danke :dance: so funktioniert es aufjedenfall.
haichen
Posts: 337
Joined: 09 Feb 2014, 08:24

Re: Doppelte Zeichen aus Variable Entfernen

09 Jan 2020, 02:04

Oder so?:

Code: Select all

test := "1,2,3,a,b,c,a,b,c,1,2,3,c,b,a,2,3,1,"
Liste := test
sort, Liste,D, u    
MsgBox, % Liste                      ; -> 1,2,3,a,b,c,
:)
garry
Posts: 2026
Joined: 22 Dec 2013, 12:50

Re: Doppelte Zeichen aus Variable Entfernen

09 Jan 2020, 07:41

danke für die Lösungen
haichen, Unterschied zu user KHA ist , dass sein script nicht sortiert
Bsp : test := "4,1,2,3,a,b,c,a,b,c,1,2,4,3,c,b,a,2,3,1,"
> 4,1,2,3,a,b,c,
haichen
Posts: 337
Joined: 09 Feb 2014, 08:24

Re: Doppelte Zeichen aus Variable Entfernen

09 Jan 2020, 11:47

Hallo garry, ich wollte es noch testen... sorry
haichen
Posts: 337
Joined: 09 Feb 2014, 08:24

Re: Doppelte Zeichen aus Variable Entfernen

10 Jan 2020, 10:58

Ich hab mir noch mal Gedanken darüber gemacht, und festgestellt, dass das nur für einstellige Listenmitglieder, also Ziffern und Buchstaben funktioniert.
Bei einer Liste zB mit 111,11 findet sich 11 in 111 wieder und wird als doppelt nicht gespeichert. Test:="111,11,aaa,aa,12345,34"

Sollen doppelte mehrstellige Zahlen und/oder Wörter aus einer Liste entfernt werden, müsste so etwas funktionieren:

Code: Select all

Test:="111,11,aaa,aa,12345,34,34,111,aa,4,4,2,3,a,b,c,aaa,b,c,111,2,4,3,c,b,11,aa,2,3,1"
; => 111,11,aaa,aa,12345,34,4,2,3,a,b,c,1
Liste := ""
test:=trim(test,",")
Loop, parse, test, `,
    If !InStr( "," Liste  ",",  "," A_LoopField ",")
        Liste .=   A_LoopField ","
Liste:=trim(Liste,",")

MsgBox, % Liste
garry
Posts: 2026
Joined: 22 Dec 2013, 12:50

Re: Doppelte Zeichen aus Variable Entfernen

10 Jan 2020, 13:35

haichen , vielen Dank für den komplexen script
haichen
Posts: 337
Joined: 09 Feb 2014, 08:24

Re: Doppelte Zeichen aus Variable Entfernen

11 Jan 2020, 04:17

Hallo garry,
das Skript sieht nur etwas unübersichtlich aus. Es besitzt die gleiche Logik wie das Skript von KHA.
Der Unterschied ist, dass ich nicht die blanken Wörter/Zahlen zum vergleichen nehme.

KHA geht den Teststring Wort für Wort durch, und schaut dann ob das Wort bereits in der Liste ist. Wenn nicht, wird das Wort an die Liste angehängt.

Ein Beispiel: die Liste enthält zB.bereits "1,4,2,aaa". Wenn in Test dann "aa" getestet wird, ist "aa" bereits in der Liste enthalten (in "aaa") und wird deshalb nicht angehängt. Das führt dann zu einem falschen Ergebnis (bei einzelnen Buchststaben und Ziffern wäre das Ergebnis richtig).

Meine Version macht das gleiche, schaut aber ob ",aa," in der Liste vorhanden ist. Ansonsten ist das Skript das gleiche.

Wenn du mal in meinem Skript in der Zeile

Code: Select all

 If !InStr( "," Liste  ",",  "," A_LoopField ",") ;oder 
 If !InStr( ",1,4,2,aaa,", ",aa,") ;Möglicher Code während der Ausführung
die Kommata herausnimmst erhälst du:

Code: Select all

If !InStr(Liste, A_LoopField ) 
 If !InStr( "1,4,2,aaa", "aa") ;Möglicher Code während der Ausführung
exakt was KHA geschrieben hat.

der erste Trimbefehl hat den Zweck immer den gleichen Ausgangspunkt zu haben: Ein Liste ohne Komma am Anfang und Ende.
Der zweite Trimbefehl macht dasselbe mit dem Ergebnis.

Erklären ist immer das schwierigste. :-)
UnReALiTyy
Posts: 143
Joined: 06 Jun 2017, 11:38

Re: Doppelte Zeichen aus Variable Entfernen

11 Jan 2020, 07:35

@haichen vielen Dank für die Erweiterung und deine Erklärung.
Speichere ich auch gleich mit ab, aber das Skript von @KHA war genau das was ich brauchte, also das er jedes Zeichen einzelnd kontrolliert und aussortiert. Aber vielleicht brauche ich deine Version irgendwann mal in der Zukunft. :thumbup: :thumbup:
garry
Posts: 2026
Joined: 22 Dec 2013, 12:50

Re: Doppelte Zeichen aus Variable Entfernen

11 Jan 2020, 11:59

haichen
Erklären ist immer das schwierigste
... Begreifen noch mehr ... vielen Dank für die Erklärung und scripte
mal zusammengefasst, hier `r`n als delimiter
Beispiel :
ein logfile , wollte doppelte Linien entfernen ohne zu sortieren ,
hier als Beispiel mit Datum 2019/12/22 ( die ersten Stellen ( Zahlen 0-9 ) und 111 und 11 habe ich zur Verständnis angefügt )
KHA's script würde zu diesem Zweck hier auch funktionieren

Code: Select all

;/*
; KHA
dlm:="`r`n"
test=
(ltrim join`r`n
111
11
9-https://download.omroep.nl/nos/content/mp4/web02/2019/12/18/46541/mp4_web02_backup.mp4
8-https://download.omroep.nl/nos/content/mp4/web02/2019/12/20/46600/mp4_web02_backup.mp4
7-https://download.omroep.nl/nos/content/mp4/web02/2019/12/22/46621/mp4_web02.mp4
7-https://download.omroep.nl/nos/content/mp4/web02/2019/12/22/46621/mp4_web02.mp4
1-https://download.omroep.nl/nos/content/mp4/web02/2019/12/30/46757/mp4_web02.mp4
5-https://download.omroep.nl/nos/content/mp4/web02/2019/12/31/46780/mp4_web02_backup.mp4
3-https://download.omroep.nl/nos/content/mp4/web02/2020/01/01/46789/mp4_web02.mp4
0-https://download.omroep.nl/nos/content/mp4/web02/2020/01/03/46833/mp4_web02.mp4
6-https://download.omroep.nl/nos/content/mp4/web02/2020/01/06/46880/mp4_web02.mp4
)
Liste := ""
Loop, parse, test, `n,`r
{
	If !InStr(Liste, A_LoopField)
	Liste .= A_LoopField . dlm

}
msgbox, 262208,KHA zeigt nur 111 ,%liste%
;return
;*/
;--------------------------------------------------------------------------------------


;/*
;- Haichen-1   sort 0-9
dlm:="`r`n"
test=
(ltrim join`r`n
111
11
9-https://download.omroep.nl/nos/content/mp4/web02/2019/12/18/46541/mp4_web02_backup.mp4
8-https://download.omroep.nl/nos/content/mp4/web02/2019/12/20/46600/mp4_web02_backup.mp4
7-https://download.omroep.nl/nos/content/mp4/web02/2019/12/22/46621/mp4_web02.mp4
7-https://download.omroep.nl/nos/content/mp4/web02/2019/12/22/46621/mp4_web02.mp4
1-https://download.omroep.nl/nos/content/mp4/web02/2019/12/30/46757/mp4_web02.mp4
5-https://download.omroep.nl/nos/content/mp4/web02/2019/12/31/46780/mp4_web02_backup.mp4
3-https://download.omroep.nl/nos/content/mp4/web02/2020/01/01/46789/mp4_web02.mp4
0-https://download.omroep.nl/nos/content/mp4/web02/2020/01/03/46833/mp4_web02.mp4
6-https://download.omroep.nl/nos/content/mp4/web02/2020/01/06/46880/mp4_web02.mp4
)
Liste := test
sort, Liste,U    
msgbox, 262208,HAICHEN-1 sort 0-9,%liste%
;return
;*/
;--------------------------------------------------------------------------------------



;/*

/*
Haichen :
Ich hab mir noch mal Gedanken darüber gemacht, und festgestellt, dass das nur für einstellige Listenmitglieder, also Ziffern und Buchstaben funktioniert.
Bei einer Liste zB mit 111,11 findet sich 11 in 111 wieder und wird als doppelt nicht gespeichert. Test:="111,11,aaa,aa,12345,34"
*/

;- Haichen-2
dlm:="`r`n"
test=
(ltrim join`r`n
111
11
9-https://download.omroep.nl/nos/content/mp4/web02/2019/12/18/46541/mp4_web02_backup.mp4
8-https://download.omroep.nl/nos/content/mp4/web02/2019/12/20/46600/mp4_web02_backup.mp4
7-https://download.omroep.nl/nos/content/mp4/web02/2019/12/22/46621/mp4_web02.mp4
7-https://download.omroep.nl/nos/content/mp4/web02/2019/12/22/46621/mp4_web02.mp4
1-https://download.omroep.nl/nos/content/mp4/web02/2019/12/30/46757/mp4_web02.mp4
5-https://download.omroep.nl/nos/content/mp4/web02/2019/12/31/46780/mp4_web02_backup.mp4
3-https://download.omroep.nl/nos/content/mp4/web02/2020/01/01/46789/mp4_web02.mp4
0-https://download.omroep.nl/nos/content/mp4/web02/2020/01/03/46833/mp4_web02.mp4
6-https://download.omroep.nl/nos/content/mp4/web02/2020/01/06/46880/mp4_web02.mp4
)
Liste := ""
test:=trim(test,dlm)
Loop, parse, test, `n,`r
{
    If !InStr( dlm .  Liste . dlm,dlm . A_LoopField . dlm)
        Liste .=  A_LoopField . dlm 
}
Liste:=trim(Liste,dlm)
msgbox, 262208,HAICHEN-2 OK ,%liste%
;return
;*/
;--------------------------------------------------------------------------------------
;======================================================================================
Last edited by garry on 12 Jan 2020, 07:16, edited 1 time in total.
haichen
Posts: 337
Joined: 09 Feb 2014, 08:24

Re: Doppelte Zeichen aus Variable Entfernen

12 Jan 2020, 06:02

Hallo garry,
wenn deine Logdaten genau so aufgebaut sind, kannst du tatsächlich auch sort benutzen.
Sort funktioniert aber anders als du denkst: Dx definiert den Trenner (x als Platzhalter).
Bei "D," ist also das Kommata der Trenner. Bei "D%dlm%" geht gar nichts. Es muß ein einzelnes Zeichen sein, keine Variable.
Außerdem werden die Optionen mit einem Leerzeichen getrennt wie in "D, U" (das Komma gehört zur Option D)
oder "D`% U" falls das Prozentzeichen der Trenner sein soll (Man muß hier ein ` davorsetzen um es als Buchstaben zu kennzeichnen).

Falls Du `n oder `r`n als Trenner nehmen willst fällt das D weg.

Code: Select all

test=
(
https://download.omroep.nl/nos/content/mp4/web02/2019/12/20/46600/mp4_web02_backup.mp4
https://download.omroep.nl/nos/content/mp4/web02/2019/12/22/46621/mp4_web02.mp4
https://download.omroep.nl/nos/content/mp4/web02/2019/12/22/46621/mp4_web02.mp4
https://download.omroep.nl/nos/content/mp4/web02/2019/12/30/46757/mp4_web02.mp4
https://download.omroep.nl/nos/content/mp4/web02/2020/01/01/46780/mp4_web02_backup.mp4
)
sort, test, U 
;sort, test, U R
msgbox, % "|" test "|"
Die Sortierung fängt jetzt mit dem Jahr an. Das würde die Logsortierung nicht ändern (solange der davorstehende Pfad gleich bleibt). Nur die doppelten Zeilen verschwinden.
garry
Posts: 2026
Joined: 22 Dec 2013, 12:50

Re: Doppelte Zeichen aus Variable Entfernen

12 Jan 2020, 07:19

danke haichen für die Erklärung und Korrektur betr SORT

Code: Select all

Sort, VarName [, Options]

Return to “Ich brauche Hilfe”

Who is online

Users browsing this forum: No registered users and 39 guests