对于文件中的每个Word,查找当前Word是否存在多次

时间:2016-10-28 12:46:13

标签: string file go

我是Golang的新手,我在尝试findprint文件中包含相同value的所有行时遇到了一些问题}。

我的文件结构如下:

index text
index text
     .
     .
     .
index text

index始终6 digits longtext总是16 digits long

  

我需要findprint包含相同text值的所有行。

这就是我到目前为止所做的:

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用于print与当前lines匹配的所有found[i-element]

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

  • 如何解决第一个问题?

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

    < / LI>

提前致谢。

1 个答案:

答案 0 :(得分:1)

第一个问题是由于你使用相同的流来读取文件并检查重复因此当内部到达文件底部完成时,然后外部检查是否有更多内容要扫描但它找到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
    }

这里有contains实现

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