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

问题描述 投票:6回答:3
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?
}

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

string algorithm loops go
3个回答
15
投票

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

EG

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
投票

嗨试试这个。

    /* 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
...

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


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.