Benutzer mit den meisten Antworten
Objekte die bis zu einem String gleich sind, aus Array entfernen.

Frage
-
Hallo, ich bin neu hier und komme gleich mit einer Frage die mir seit Stunden den Kopf zerbricht.
Ich Habe ein Array mit folgenden Objekten:
http://domain.de/tv8-int/live.m3u8?tkn=o5wiKueLdRdWy-xhbTy1Hg&tms=1515830343
http://domain.de/tv-a/live.m3u8?tkn=gzHsZ2Q1nL5GKKUSlGOqnQ&tms=1515830355
http://domain.de/tv-a/live.m3u8?tkn=lIGOIZLi-Amj2u9jejPXTg&tms=1515830358
http://domain.de/tvkayseri/live.m3u8?tkn=BXvAEwD17VtmXAhX7SvjuQ&tms=1515830353
http://domain.de/uzay-haber/live.m3u8?tkn=jggtNnfC7c9RhGUFIWfTkw&tms=1515830347
http://domain.de/uzay-haber/live.m3u8?tkn=oOeQwPhadSqKRwSMCRcheg&tms=1515830357wie Ihr seht gibt es hier Elemente die bis zum String "/live..." gleich sind. Hier möchte ich das dopelte Einträge gelöscht werden, welche der beiden Einträge dabei gelöscht wird ist egal.
Ich möchte, dass diese Liste nachher so ausschaut:
http://domain.de/tv8-int/live.m3u8?tkn=o5wiKueLdRdWy-xhbTy1Hg&tms=1515830343
http://domain.de/tv-a/live.m3u8?tkn=lIGOIZLi-Amj2u9jejPXTg&tms=1515830358
http://domain.de/tvkayseri/live.m3u8?tkn=BXvAEwD17VtmXAhX7SvjuQ&tms=1515830353
http://domain.de/uzay-haber/live.m3u8?tkn=oOeQwPhadSqKRwSMCRcheg&tms=1515830357Vielen Dank schon mal für eure Bemühungen
Antworten
-
Moin,
die einfachste, wenn auch vielleicht nicht die performanteste Variante wäre, die eindeutigen Teilstrings zur Prüfung der Eindeutigkeit wegzuspeichern:
$arr = @(<enthält die URLs>) $keys = @() $arr | foreach { $key = $_.Substring(0,$_.IndexOf("live.m3u8")) if ($keys -notcontains $key) { $_ $keys += $key } }
Ist die Ausgangsmenge groß, so kann es sich lohnen, dafür ein Hashset zu nehmen, ich habe dazu mal gebloggt:
http://www.it-pro-berlin.de/2017/08/powershell-wie-schnell-sind-arrays/
Eine andere Idee wäre, die Liste zunächst zu sortieren. Damit folgen die "mehrfachen" Strings in der Menge aufeinander, und man kann so verfahren:
$ckey = "jibt et nich" $arr | Sort-Object | foreach { $key = $_.Substring(0,$_.IndexOf("live.m3u8")) if ($ckey -ne $key) { $_ $ckey= $key } }
Wenn die Auswahl groß ist, kann das Sortieren aber den Performance-Vorteil des Nicht-Zwischenspeicherns wieder auffressen.
Evgenij Smirnov
I work @ msg services ag, Berlin -> http://www.msg-services.de
I blog (in German) @ http://it-pro-berlin.de
my stuff in PSGallery --> https://www.powershellgallery.com/profiles/it-pro-berlin.de/
Exchange User Group, Berlin -> https://exusg.de
Windows Server User Group, Berlin -> http://www.winsvr-berlin.de
Mark Minasi Technical Forum, reloaded -> http://newforum.minasi.com
In theory, there is no difference between theory and practice. In practice, there is.
- Als Antwort markiert Denniver ReiningMVP, Moderator Mittwoch, 17. Januar 2018 17:37
Alle Antworten
-
Moin,
die einfachste, wenn auch vielleicht nicht die performanteste Variante wäre, die eindeutigen Teilstrings zur Prüfung der Eindeutigkeit wegzuspeichern:
$arr = @(<enthält die URLs>) $keys = @() $arr | foreach { $key = $_.Substring(0,$_.IndexOf("live.m3u8")) if ($keys -notcontains $key) { $_ $keys += $key } }
Ist die Ausgangsmenge groß, so kann es sich lohnen, dafür ein Hashset zu nehmen, ich habe dazu mal gebloggt:
http://www.it-pro-berlin.de/2017/08/powershell-wie-schnell-sind-arrays/
Eine andere Idee wäre, die Liste zunächst zu sortieren. Damit folgen die "mehrfachen" Strings in der Menge aufeinander, und man kann so verfahren:
$ckey = "jibt et nich" $arr | Sort-Object | foreach { $key = $_.Substring(0,$_.IndexOf("live.m3u8")) if ($ckey -ne $key) { $_ $ckey= $key } }
Wenn die Auswahl groß ist, kann das Sortieren aber den Performance-Vorteil des Nicht-Zwischenspeicherns wieder auffressen.
Evgenij Smirnov
I work @ msg services ag, Berlin -> http://www.msg-services.de
I blog (in German) @ http://it-pro-berlin.de
my stuff in PSGallery --> https://www.powershellgallery.com/profiles/it-pro-berlin.de/
Exchange User Group, Berlin -> https://exusg.de
Windows Server User Group, Berlin -> http://www.winsvr-berlin.de
Mark Minasi Technical Forum, reloaded -> http://newforum.minasi.com
In theory, there is no difference between theory and practice. In practice, there is.
- Als Antwort markiert Denniver ReiningMVP, Moderator Mittwoch, 17. Januar 2018 17:37
-
Hallo ynsklkn,
das ist hier leider kein Script-Selbstbedienungsladen, wo Du nur sagen musst, was Du brauchst und bekommst es geliefert. Wir beantworten gern Fragen zu Powershell-Code, den Du geschrieben hast.
Vielleicht liest Du nochmal die fest angehefteten Posts oben in der Liste. Dann bist Du schon mal mit den Regeln auf dem Laufenden. ;-)
Wenn Du selbst aktiv werden möchtest und einen guten Einstieg in Powershell brauchst, könntest Du mit einem kostenlosen Video-Kurs anfangen: Learn PowerShell: Microsoft Virtual Academy - Getting Started with Microsoft PowerShell.
Du kannst auch mal schauen, ob Du schon fertige Scripte findest, die Du an Deiner Anforderungen anpassen kannst. z.B. hier: Powershell Gallery oder hier: Microsoft Technet Script Library.
Wenn Du schon Grundkenntnisse hast und nur ein paar Tipps brauchst: ich würde damit beginnen die URLs bis zum String "/live" zu "extrahieren" und damit weiterzumachen. Wenn Du schon Code hast, den Du zeigen kannst, kannst Du den hier posten (als Code formatieren bitte!) und wir können versuchen, gemeinsam was Elegantes auszuknobeln. ;-)
Best regards,
(79,108,97,102|%{[char]$_})-join''
-
Vielen Dank für die ausführliche Antwort und Sorry wenn ich mich nicht an die Regeln gehalten habe. Ich habe schon so viel probiert und bin einfach nicht weitergekommen, daher habe ich mich ganz verzweifelt an euch gewendet.
Mein Problem war folgendes:
Ich kann zwar per Substring die Pfade bis auf den Bereich kürzen und die Doppelten entfernen, ich brauche aber dennoch als Ausgabe den vollen Pfad und nicht den Teilstring.
Bin zur Zeit leider nicht daheim, werde aber sobald ich kann deinen Code Testen und Berichten. VIELEN DANK
Liebe Grüße
Yunus
Yunus K. | Softwarepaketierer
-
Ich kann zwar per Substring die Pfade bis auf den Bereich kürzen und die Doppelten entfernen, ich brauche aber dennoch als Ausgabe den vollen Pfad und nicht den Teilstring.
Moin ... als Softwarepaketierer sollte man sowas aber wissen. ;-) :-D
Du musst den Rest der Object-Properties ja nicht "wegwerfen". Du kannst z.B. mittels "calculated Properties" das Object um die Eigenschaft erweitern, die Du brauchst.
Select-Object <- Beispiel 4 wäre sowas
Best regards,
(79,108,97,102|%{[char]$_})-join''