我是Golang
的新手,我在尝试find
和print
文件中包含相同value
的所有行时遇到了一些问题}。
我的文件结构如下:
index text
index text
.
.
.
index text
index
始终6 digits long
且text
总是16 digits long
。
我需要
find
和text
值的所有行。
这就是我到目前为止所做的:
func main() {
//Array to contain common texts
found := make([]string, 6)
r, _ := os.Open("store.txt")
scanner := bufio.NewScanner(r)
//Splits in words
scanner.Split(bufio.ScanWords)
//Loop over all Words in the file
for scanner.Scan() {
line := scanner.Text()
//If the current line is 16 digits long
if(utf8.RuneCountInString(line) == 16){
currLine := line
//Search in the same files all the 16 digits long texts and
for scanner.Scan(){
searchLine := scanner.Text()
//If a same text is found
if(utf8.RuneCountInString(searchLine) == 16){
//Append it to found array
if(currLine == searchLine){
found = append(found, currLine)
}
}
}
}
}
//Print found Array
fmt.Println(found)
//Close File
r.Close()
}
然后,我想将found
用于print
与当前lines
匹配的所有found[i-element]
。
上面的代码仅适用于第一步。
例如,如果在我的文件中,它在第一行得到1234567890123456
(例如从索引1)然后它只检查并附加一次,它不会循环所有行(对于剩余的n-1)字)。
如何解决第一个问题?
您认为在texts
中添加重复的Array
,然后根据它打印匹配的行是一个坏主意吗?
提前致谢。
答案 0 :(得分:1)
第一个问题是由于你使用相同的流来读取文件并检查重复因此当内部到达文件底部完成时,然后外部检查是否有更多内容要扫描但它找到EOF并退出。
解决问题的最简单方法是创建一个数组,在该数组中放置第一次找到的所有文本,当文本值已经存在时,只打印副本。像这样:
duplicates := make([]string,0)
for scanner.Scan() {
line := scanner.Text()
text := line[6:]
//Do your check
//if all your control are ok
if ! contains(duplicates, text) {
duplicates = append(duplicates, text)
} else {
//Print the duplicates
}
这里有contains
实现
func contains(s []string, e string) bool {
for _, a := range s {
if a == e {
return true
}
}
return false
}