Golang:在文件中查找字符串并显示行号

时间:2016-05-16 13:38:18

标签: string algorithm loops go

read, err := ioutil.ReadFile(path)
if err != nil {
    return err
}

if strings.Contains(string(read), "STRING") {
    // display line number?
    // what if many occurrences of the string
    // how to display for each the line number?
}

我试图搜索文件中的特定字符串,并显示字符串所在的行号。

3 个答案:

答案 0 :(得分:16)

使用scanner逐行迭代文件,增加每个循环的行数。

e.g。

f, err := os.Open(path)
if err != nil {
    return 0, err
}
defer f.Close()

// Splits on newlines by default.
scanner := bufio.NewScanner(f)

line := 1
// https://golang.org/pkg/bufio/#Scanner.Scan
for scanner.Scan() {
    if strings.Contains(scanner.Text(), "yourstring") {
        return line, nil
    }

    line++
}

if err := scanner.Err(); err != nil {
    // Handle the error
}

更新:如果您需要在“数千个文件”中执行此操作(根据另一个答案的注释),那么您可以将此方法包装在worker pool中并同时运行。

答案 1 :(得分:2)

嗨试试这个。

    /* ioutil.ReadFile returns []byte, error */
    data, err := ioutil.ReadFile("output.txt")
    /* ... omitted error check..and please add ... */
    /* find index of newline */
    file := string(data)
    line := 0
    /* func Split(s, sep string) []string */
    temp := strings.Split(file, "\n")

    for _, item := range temp {
        fmt.Println("[",line,"]\t",item)
        line++
    }

基本上,它将使用ioutil包读取文件并从内容中找出换行符。当您找到某个字符或换行符等时,字符串包非常有用。请查看GO的官方网页,以获取进一步的说明和示例。 (https://golang.org/pkg/strings/#Split)。

我从上面的(https://golang.org/pkg/strings/#Split)做了一个“output.txt”,预期的输出应该是

[ 0 ]    
[ 1 ]    Examples
[ 2 ]    
[ 3 ]        Contains
[ 4 ]        ContainsAny
[ 5 ]        Count
[ 6 ]        EqualFold
[ 7 ]        Fields
[ 8 ]        FieldsFunc
[ 9 ]        HasPrefix
[ 10 ]       HasSuffix
...

关于格式,您可以修改     {fm.Printf fmt.Println("[",line,"]\t",item)

答案 2 :(得分:1)

首先按行分割文件(可以使用strings.Splitbytes.Split完成),然后遍历这些行并分别检查每行是否包含所需的字符串。如果是,则打印行号。