在此代碼中,我從文件中查找數據,它還為我提供了我搜索的結果。這意味著它只打印姓名或電話號碼。但是我想打印存在特定姓名或電話號碼的整行。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 關注
- 99 瀏覽
添加回答
舉報
0/150
提交
取消