英文:
Parsing a Matrix from a File in Go
问题
我有一个包含以下内容的文件:
1 2 3 4 5
6 0 0 0 7
8 0 0 0 9
10 0 0 0 11
12 13 14 15 16
我想要的是一个[][]int
的多维数组(或切片)。我尝试使用scanner.Scanner
库进行操作:
scan.Init(f) // f是一个文件
scan.Whitespace = 1<<'\t' | 1<<'\r' | 1<<' '
tok := scan.Scan()
for tok != scanner.EOF {
// 对tok进行处理
if tok == scanner.String {
fmt.Print("\n")
} else if tok == scanner.Int {
// 处理整数值
// 我如何获取匹配的token值?
}
tok = scan.Scan()
}
我找不到获取匹配的token值的方法。
所以有两个问题:
- 如何获取任何扫描到的token的值?
- 在不知道确切大小的情况下,如何动态创建这个二维切片/数组?(可以是任意大小)
英文:
I'm having a file with the following contents:
1 2 3 4 5
6 0 0 0 7
8 0 0 0 9
10 0 0 0 11
12 13 14 15 16
What I want is an multidimensional array (or slice) of [][]int
. I tried to fiddle around with the scanner.Scanner
library:
scan.Init(f) // f is a file
scan.Whitespace = 1<<'\t' | 1<<'\r' | 1<<' '
tok := scan.Scan()
for tok != scanner.EOF {
// do something with tok
if tok == scanner.String {
fmt.Print("\n")
} else if tok == scanner.Int {
// Handle int value
// How do I get the matched token value?
}
tok = scan.Scan()
}
I can't find a way to get the value of the token that was matched.
So two questions:
- How do I get the value of any scanned token?
- How can I dynamically create that two-dimensional slice/array before knowing it's exact size? (can be any size really)
答案1
得分: 2
Ad 1: Scanner.TokenText
Ad 2.: 简而言之 - 如果维度需要从文本表示中推断出来,内循环:将行片段(比如 []int)追加到一行中,直到遇到换行符 -> 最大列数。外循环:将这些行片段(追加到一个 [][]int)直到遇到文件结束符 -> 最大行数。
英文:
Ad 1: Scanner.TokenText
Ad 2.: Briefly - if the dims are to be inferred from the text representation, inner cycle: Append to a line slice (say []int) until line break -> num of mx cols. Outer cycle: Append those line slices (to a [][]int) until EOF -> num of mx rows.
答案2
得分: 1
我不会使用scanner包(适用于解析上下文无关文法,类似于Go语言)来读取文件中的数字这样简单的任务。我会使用以下方法之一:
- 一个简单的循环和fmt.Fscan,或者
- ioutil.ReadFile,strings.Split和strconv.Atoi
在不知道确切大小之前,我如何动态创建二维切片/数组?(可以是任意大小)
你不能。要么在第二次读取文件时知道确切的大小,要么只需使用append来动态调整切片的底层数组大小。多次调用append()也会导致摊销的O(n)行为,所以这不应该是个问题。
英文:
I wouldn't use the scanner package (which is suited to parse context free grammars, similar to the Go language) for such a simple task of reading numbers from a file. I would either use:
- a simple loop and fmt.Fscan, or
- ioutil.ReadFile, strings.Split and strconv.Atoi
> How can I dynamically create that two-dimensional slice/array before knowing it's exact size? (can be any size really)
You can't. Either read the file twice to know the exact size on your 2nd pass, or just use append to dynamically resize the underlying array of the slice. Calling append()
multiple times also results in an amortized O(n) behavior, so that shouldn't be a problem.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论