在此代码中,我从文件中查找数据,它还为我提供了我搜索的结果。这意味着它只打印姓名或电话号码。但是我想打印存在特定姓名或电话号码的整行。func readFile() { var searchData string fmt.Printf("Enter the name or phone number to search: ") fmt.Scanln(&searchData) content, err := ioutil.ReadFile("data.csv") if err != nil { log.Fatal(err) } suffix := suffixarray.New(content) indexList := suffix.Lookup([]byte(searchData), -1) if len(indexList) == 0 { fmt.Println("Data is not found") return } data := string(content) for _, idx := range indexList { fmt.Println("Data is found:", string(data[idx:idx+len(searchData)])) fmt.Println(data) }}
1 回答
蝴蝶刀刀
TA贡献1801条经验 获得超8个赞
如果位置部分位于一条线中,则可以从那里向后扫描以查找文件的上一个 \n 或开头。同样,您可以从那里向前扫描以查找文件的下一个 \n 或末尾。这两个终结点将为您提供包含给定索引的完整行。
像这样的东西(未经测试):
start := idx
for start >= 0 && data[start] != '\n' {
start--
}
end := idx
for end < len(data) && data[end] != '\n' {
end++
}
fmt.Println(string(data[start+1:end]))
也可以使用 和 使用 包编写它,但必须处理在索引点之后找不到 \n 的情况。bytesLastIndexByteIndexByte
start := bytes.LastIndexByte(data[:idx], '\n')
end := bytes.IndexByte(data[idx:], '\n') + idx
if end == idx - 1 { end = len(data) }
fmt.Println(string(data[start+1:end]))
- 1 回答
- 0 关注
- 117 浏览
添加回答
举报
0/150
提交
取消
