如何在golang中检查文件是否包含字符串?

时间:2016-05-12 18:25:56

标签: go pattern-matching

我试图在谷歌上找到文件和字符串之间的模式匹配功能,但我找不到。 我试图使用strings.Contains()但它在大输入文件中给出错误的结果。                            我想知道,在golang中是否有任何函数用于搜索或检查某些文件中的字符串?如果不是,请告诉我我是如何以另一种方式解决这个问题的。

这是我的代码:

package main

import (
    "bufio"
    "fmt"
    "io/ioutil"
    "os"
    "strings"
)

func main() {

    reader := bufio.NewReader(os.Stdin)
    fmt.Print("Enter text: ")
    text, _ := reader.ReadString('\n')

    // read the whole file at once

    b, err := ioutil.ReadFile("input.txt")
    if err != nil {
        panic(err)
    }

    s := string(b)
    length := len(s)

    //check whether s contains substring text
    fmt.Println(strings.Contains(s, text))

}

2 个答案:

答案 0 :(得分:3)

如果我正确地阅读了你的问题,你想从文件中读取并确定在命令行输入的字符串是否在该文件中...而且我认为你看到的问题与字符串分隔符有关, reader.ReadString('\n')位,而不是string.Contains()

在我看来,使用fmt.Scanln制作想要的内容会更容易一些。它会简化一些事情并返回一个我很确定你想要的结果。尝试使用此代码的变体:

package main

import (
    "fmt"
    "io/ioutil"
    "strings"
)

func main() {
    var text string
    fmt.Print("Enter text: ")
    // get the sub string to search from the user
    fmt.Scanln(&text)

    // read the whole file at once
    b, err := ioutil.ReadFile("input.txt")
    if err != nil {
        panic(err)
    }
    s := string(b)
    // //check whether s contains substring text
    fmt.Println(strings.Contains(s, text))
}

答案 1 :(得分:1)

我只是添加一个标志来使用命令行参数。如果没有通过,它会提示你:)。

package main

import (
    "flag"
    "fmt"
    "io/ioutil"
    "strings"
)

//Usage go run filename -text=dataYouAreLookingfor
//if looking for Nissan in file the command will be
// go run filename -text=Nissan

func main() {
    var text string
    // use it as cmdline argument
    textArg := flag.String("text", "", "Text to search for")
    flag.Parse()
    // if cmdline arg was not passed ask
    if fmt.Sprintf("%s", *textArg) == "" {
        fmt.Print("Enter text: ")
        // get the sub string to search from the user
        fmt.Scanln(&text)
    } else {
        text = fmt.Sprintf("%s", *textArg)
    }
    // read the whole file at once
    b, err := ioutil.ReadFile("input.txt")
    if err != nil {
        panic(err)
    }
    s := string(b)
    // //check whether s contains substring text
    fmt.Println(strings.Contains(s, text))
}