我有一个大文件(对于内存来说太大了),我需要用分隔符 \'|\' 解析每个记录。问题是,每个记录的大小都不同,这就是为什么我总是收到错误 \'但是...
我有一个大文件(对于内存来说太大了),我需要用分隔符“|”解析每个记录。问题是,每个记录的大小都不同,这就是为什么我总是收到错误“bufio.Scanner:token 太长”。
如果我遇到 bufio.Scanner:token too long 错误,是否有任何方法可以用更大的缓冲区大小重试扫描?或者 bufio.Scanner 对我来说不是正确的选择,因为我不知道每个记录的确切大小?
谢谢
https://go.dev/play/p/Erx15nXXCGk
package main
import (
"bufio"
"bytes"
"fmt"
"strings"
)
func main() {
// Example byte array
byteArray := []byte("data1|data2|data3|data4|data5|data6|data7|data8|data9|data10")
// Buffer size for reading chunks
bufferSize := 6
buf := make([]byte, bufferSize)
// Create a bufio.Scanner with a custom split function
scanner := bufio.NewScanner(bytes.NewReader(byteArray))
scanner.Buffer(buf, bufferSize)
scanner.Split(splitFunc)
// Read the byte array in chunks
for scanner.Scan() {
// Process each token (chunk)
chunk := scanner.Text()
fmt.Println("Chunk:", chunk, "Chunk Length:", len(chunk))
}
if err := scanner.Err(); err != nil {
if err == bufio.ErrTooLong {
fmt.Println("Error:", err)
fmt.Printf("Buffer size %d is too small...\n", bufferSize)
} else {
fmt.Println("Error:", err)
}
}
}
func splitFunc(data []byte, atEOF bool) (advance int, token []byte, err error) {
// Return nothing if at end of file and no data passed
if atEOF && len(data) == 0 {
return 0, nil, nil
}
if i := strings.Index(string(data), "|"); i >= 0 {
return i + 1, data[0:i], nil
}
// If at end of file with data return the data
if atEOF {
return len(data), data, nil
}
return
}
我正在 MATLAB 中开发一个项目,该项目本质上是一个具有大量参数的物理问题的线性系统求解器,这是我第一次尝试 OOP。之前,我有很多 MATLAB 脚本...
我正在 MATLAB 中做一个项目,它本质上是一个具有大量参数的物理问题的线性系统求解器,这是我第一次尝试 OOP。之前,我有很多 MATLAB 脚本,其中包含大量非常相似的代码,所以我认为这将是一个学习 OOP 的好例子。
我有一个类,其属性包含物理问题中可能存在的所有参数(但不一定需要所有参数),以及我想用来解决该问题的线性系统的大小。我有两个依赖属性,分别表示矩阵 A 和右侧向量 B。求解 Ax = B 是该应用程序的重点。
我现在正尝试编写一个 get 方法来确定 B。我的问题是,这不遵循可以用类属性来一般表达的公式。(可以,但对于每个问题,方法不同。我的意思是,对于一个问题,可以有像 B(n) = obj.parameter1*obj.parameter2 这样的依赖关系,而对于另一个问题,可以有 B(n) = 3*obj.paramter(1)*obj.parameter2)
我想知道上述内容是否意味着必须在类之外定义 B?如果是这样,我该如何避免陷入之前的情况,即有大量类似的脚本定义 B?
在各个问题中始终一致的一点是,B 的代数定义如下:
nj = -10:10 % array of integers from -10 to 10
for m=1:length(nj)
if nj(m) == 0
B(m) = % (function)
else
B(m) = % (another function, dependent on m)
end
end
我希望这是有道理的。谢谢你帮助这位无知的数学家。