2017-11-21 3 views
-3

ich einen Strom von Nachrichten mit einem Go-Kanal eingeben, von denen die meisten wie folgt aussehen:gemeinsam haben Präfix Teil Kombinieren

T: added package to graph: acl-devel/2.2.52_4/armv6l-musl T: added package to graph: rofs-filtered/1.7_1/x86_64-musl T: added package to graph: rofs-filtered/1.7_1/HOST T: added package to graph: libshout/2.4.1_1/i686 T: added package to graph: mate-terminal/1.18.1_1/armv6l T: added package to graph: bullet-devel/2.86.1_1/x86_64-musl T: added package to graph: bullet-devel/2.86.1_1/HOST T: added package to graph: cubietruck-uboot/2016.11_1/armv6l-musl T: added package to graph: libfontenc/1.1.3_1/i686-musl T: added package to graph: apk-tools/2.8.1_1/x86_64 T: added package to graph: virtualbox-ose/5.1.28_1/armv7l-musl T: added package to graph: acl-devel/2.2.52_4/armv7l T: added package to graph: apk-tools/2.8.1_1/x86_64-musl T: added package to graph: tzutils/2017c_1/x86_64-musl T: added package to graph: python-argh/0.26.2_1/noarch T: added package to graph: tzutils/2017c_1/HOST

Ich möchte die oben Saiten effizient in der Lage sein zu kombinieren, Zeile für Zeile, aber verlier keine Informationen. Dies ist zum Drucken auf einen IRC-Kanal gedacht, deshalb möchte ich keine Hochwasserwarnungen auslösen. Um dies zu tun, ich habe die oben sein ähnlich die unten massieren will:

T: added package to graph: rofs-filtered/1.7_1/{x86_64-musl,HOST} T: added package to graph: libshout/2.4.1_1/i686 T: added package to graph: mate-terminal/1.18.1_1/armv6l T: added package to graph: bullet-devel/2.86.1_1/{x86_64-musl,HOST} T: added package to graph: cubietruck-uboot/2016.11_1/armv6l-musl T: added package to graph: libfontenc/1.1.3_1/i686-musl T: added package to graph: apk-tools/2.8.1_1/{x86_64,x86_64-musl} T: added package to graph: virtualbox-ose/5.1.28_1/armv7l-musl T: added package to graph: acl-devel/2.2.52_4/{armv6l-musl,armv7l} T: added package to graph: tzutils/2017c_1/{x86_64-musl,HOST} T: added package to graph: python-argh/0.26.2_1/noarch

Während immer noch eine Menge Ausgabe und Nachrichten, der Großteil der Berichterstattung ist ca. 10-12 Zeilen mit gemeinsamen Präfixen oben, durchsetzt mit der Ausgabe von mehreren Threads macht das oben (daher die geringe Anzahl von Duplikaten in den obigen Daten, viele Threads und die Daten ist ein Snapshot von etwa 2 Sekunden).

Wie kann ich mehrere Zeilen zusammenfassen, um entlang ihres gemeinsamen Präfix in Go zu verbinden?

+1

Was Sie bisher versucht haben, und warum nicht Ihr Versuch zu arbeiten? – maerics

+0

Ich habe die Dinge bisher nicht ausprobiert. Ich bin auf der Suche nach dem besten Ansatz, und alles, was ich jetzt hinlege, wäre ein Rätselraten. Nach allem, was ich weiß, weiß ich nicht, welchen Begriff ich für dieses Problem googlen soll, und es gibt eine Standardbibliotheksfunktion, die nur darauf wartet, mein Problem zu lösen. – Aviator45003

Antwort

1

Hier ist eine mögliche Lösung. Sie können vor dem Befehl append() nach Duplikaten suchen, wenn Sie müssen.

https://play.golang.org/p/XodCgl1fa5

package main 

import (
    "bufio" 
    "fmt" 
    "strings" 
) 

func main() { 
    input := `T: added package to graph: acl-devel/2.2.52_4/armv6l-musl 
T: added package to graph: rofs-filtered/1.7_1/x86_64-musl 
T: added package to graph: rofs-filtered/1.7_1/HOST 
T: added package to graph: libshout/2.4.1_1/i686 
T: added package to graph: mate-terminal/1.18.1_1/armv6l 
T: added package to graph: bullet-devel/2.86.1_1/x86_64-musl 
T: added package to graph: bullet-devel/2.86.1_1/HOST 
T: added package to graph: cubietruck-uboot/2016.11_1/armv6l-musl` 

    m := make(map[string][]string) 
    s := bufio.NewScanner(strings.NewReader(input)) 
    for s.Scan() { 
     t := s.Text() 
     i := strings.LastIndex(t, "/") 
     p := t[:i+1] 
     last := t[i+1 : len(t)] 
     m[p] = append(m[p], last) 
    } 
    for k, v := range m { 
     fmt.Print(k, "{", strings.Join(v, ","), "}", "\n") 
    } 
} 
Verwandte Themen