2016-10-28 15 views
1

私は非常に新しいGolangです。findprintに同じ問題を含むすべての行valueファイル内の各単語について、現在の単語が複数回存在するかどうかを調べる

私のファイルは、以下のように構成されています

indexは常に 6 digits longtextある
index text 
index text 
    . 
    . 
    . 
index text 

は常に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() 
} 

その後、私はprint現在found[i-element]に一致するすべてのlinesfoundを使用したいと思います。

上記のコードは、最初の手順でのみ動作します。 たとえば、ファイル内の最初の行で123456789(インデックス1など)を取得した場合は、1回だけチェックして追加します。残りのn-1ワードについてはすべての行についてループしません。

  • 最初の問題を修正するにはどうすればよいですか?

  • あなたはArrayで重複textsを追加することだと思うし、それに基づいて、一致する行を印刷してください悪い考えですか?

ありがとうございます。

答えて

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 
} 
+0

私はチェックのようなものをどのように行う必要がありますか? – AndreaM16

+0

気にしなくても、正しく動作します。単に '現在の行'を印刷するだけです。 – AndreaM16

+0

最後に、 'currLine、duplicateLIne'というように、' 000000 ABABABABABABABAB、010101 ABABABABABABABAB'のように現在の重複フィールドをどのように印刷するのですか? – AndreaM16

関連する問題