String 对于文件中的每个单词,查找当前单词是否多次出现

String 对于文件中的每个单词,查找当前单词是否多次出现,string,file,go,String,File,Go,我对Golang非常陌生,我在尝试查找和打印文件中包含某个相同值的所有行时遇到了一些问题 我的文件的结构如下所示: index text index text . . . index text 其中,索引始终为6位数,文本始终为16位数 我需要查找并打印包含相同文本值的所有行 这就是我迄今为止所尝试的: func main() { //Array to contain common texts found := make([]string, 6)

我对
Golang
非常陌生,我在尝试
查找
打印文件中包含某个相同
值的所有行时遇到了一些问题

我的文件的结构如下所示:

index text
index text
     .
     .
     .
index text
其中,
索引
始终为
6位数
文本
始终为
16位数

我需要
查找
打印
包含相同
文本
值的所有行

这就是我迄今为止所尝试的:

func main() {

    //Array to contain common texts
    found := make([]string, 6)

    r, _ := os.Open("store.txt")
    scanner := bufio.NewScanner(r)
    //Splits in words
    scanner.Split(bufio.ScanWords)
    //Loop over all Words in the file
    for scanner.Scan() {
        line := scanner.Text()
        //If the current line is 16 digits long
        if(utf8.RuneCountInString(line) == 16){
           currLine := line
            //Search in the same files all the 16 digits long texts and
            for scanner.Scan(){
                searchLine := scanner.Text()
                //If a same text is found
                if(utf8.RuneCountInString(searchLine) == 16){
                    //Append it to found array
                    if(currLine == searchLine){
                        found = append(found, currLine)
                    }
                }
            }
        }
    }
    //Print found Array
    fmt.Println(found)
    //Close File
    r.Close()
}
然后,我想使用
found
打印与当前
found[I-element]
匹配的所有

上面的代码只适用于第一步。 例如,如果在我的文件中,在第一行它得到
1234567890123456
(例如,从索引1),然后它只检查并追加一次,它不会循环所有行(对于剩余的n-1个字)

  • 如何解决第一个问题?

  • 您认为在
    数组中添加重复的
    文本
    ,然后根据它打印匹配行是个坏主意吗?


提前感谢。

第一个问题是因为您使用同一个流读取文件并检查副本,所以当内部for到达文件底部完成时,外部for检查是否还有其他内容要扫描,但它找到EOF并退出。
解决问题的最简单方法是创建一个数组,在其中放置第一次找到的所有文本,当文本值已经存在时,只需打印副本。大概是这样的:

duplicates := make([]string,0)
for scanner.Scan() {
    line := scanner.Text()
    text := line[6:]
    //Do your check
    //if all your control are ok
    if ! contains(duplicates, text) {
        duplicates = append(duplicates, text)
    } else {
        //Print the duplicates
    }
这里是
包含的
实现

func contains(s []string, e string) bool {
    for _, a := range s {
        if a == e {
            return true
        }
    }
    return false
}

我应该如何进行这种检查?不管怎样,它工作正常,只需要打印
当前行
。最后一件事,我应该如何以我有
currLine,duplicateLIne
的方式打印当前重复字段,比如:
000000 abababab,010101 ABABAB
?您可以使用当前行创建一个结构,而不是仅存储字符串,然后在func中包含匹配项时返回该结构。或者,如果要返回数组中的所有匹配项,请在contains中创建临时数组,追加所有匹配项,然后返回临时数组。希望这能对你有所帮助