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

String Golang:在文件中查找字符串并显示行号,string,algorithm,loops,go,String,Algorithm,Loops,Go,我正在尝试搜索文件以查找特定字符串,并显示字符串所在的行号。首先将文件拆分为行(可以使用字符串。拆分或字节。拆分),然后遍历行并单独检查每行是否包含所需字符串。如果是,则打印行号。用于逐行迭代文件,增加每个循环的行数 e、 g 更新:如果您需要跨“数千个文件”(根据另一个答案上的评论)执行此操作,那么您可以将此方法包装在一个文件中并同时运行。您好,请尝试一下 f, err := os.Open(path) if err != nil { return 0, err } defer f.C

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

首先将文件拆分为行(可以使用
字符串。拆分
字节。拆分
),然后遍历行并单独检查每行是否包含所需字符串。如果是,则打印行号。

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

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
}
基本上,它将使用ioutil包读取文件,并从内容中找出换行符。当您找到某个字符或换行符等时,字符串包非常有用。查看GO的官方网页,了解更多说明和示例。().

我在上面()中创建了一个“output.txt”,预期的输出应该是

    /* 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++
    }
关于格式,您可以修改
fmt.Println(“[”行“]\t”,项)
带fmt.Printf(这对搜索数千个文件来说不是不切实际吗?或者你确定这是最好的解决方案吗?另一种方法是根据搜索的字符串分割文件,并计算段中的换行数,这样你就可以计算行号。老实说,我不知道哪种方法最有效,这取决于如何处理这些操作在内部进行。最好使用
scanner.Bytes()
Bytes.Contains
,以避免从
[]字节
字符串
的转换。我不确定工作池在数千个文件的情况下是否会有所帮助——代码将会(或应该是)io绑定和多个goroutine将意味着更多的磁盘搜索。工作池将取决于您是否先将文件读入内存、文件有多大、并发多少等。没有足够的信息可供参考,但小的工作池即使在单个SSD上也不太可能有缺点。如果您想读取恒定数据,请尝试以下
bufio.NewScanner(strings.NewReader(`bar foo…`))
    /* 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++
    }
[ 0 ]    
[ 1 ]    Examples
[ 2 ]    
[ 3 ]        Contains
[ 4 ]        ContainsAny
[ 5 ]        Count
[ 6 ]        EqualFold
[ 7 ]        Fields
[ 8 ]        FieldsFunc
[ 9 ]        HasPrefix
[ 10 ]       HasSuffix
...