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