golang:逐行读取文本文件的int字符串
golang: read text file line by line of int strings
我正在处理一个包含整数列表作为字符串的输入文件
10
..
我选择用ReadString('\n')方法逐行阅读
下面的代码
line, error := inputReader.ReadString('\n')
lineStr := string(line)
控制台输出(长度和值)
lineStr %v 4
lineStr %v 10
lineStr 的长度为“4”,可能是因为符文编码。
然后我尝试了几种方法将其转换为简单整数,但都没有成功。
Ex1
num, _ := strconv.ParseUint(lineStr, 0, 64)
输出一个数字 0(应该是 10)
Ex2
num, _ := strconv.Atoi(lineStr)
输出一个数字 0(应该是 10)
Ex3
num, _ := strconv.Atoi("10")
输出数字 10(确定)
Ex4
num, _ := strconv.ParseUint("10", 0, 64)
输出数字 10(确定)
文字中的字符串可以,但文件中的字符串不起作用,有什么问题吗?
提前致谢
如果您查看 ReadString
的文档,您会注意到返回的 string
将包含分隔符(在您的情况下为 \n
)。
ReadString reads until the first occurrence of delim in the input,
returning a string containing the data up to and including the
delimiter.
并且因为读取 10 之后的行的长度是 4,所以我假设这些行由 \r\n
分隔。删除它的最简单方法是使用 Trim
函数之一(如 TrimSpace)。
来自文档:"ReadString reads until the first occurrence of delim in the input, returning a string containing the data up to and including the delimiter."
因此,我建议您使用扫描仪,它可以像您期望的那样处理这种情况:
scanner := bufio.NewScanner(file)
for scanner.Scan() {
lineStr := scanner.Text()
num, _ := strconv.Atoi(lineStr)
fmt.Println(lineStr, num)
}
引用 bufio.Reader.ReadString 的文档(强调我的):
ReadString reads until the first occurrence of delim in the input, returning a string containing the data up to and including the delimiter.
的文档
The errors that ParseInt returns have concrete type *NumError and include err.Num = s. If s is empty or contains invalid digits, err.Err = ErrSyntax and the returned value is 0
你的问题是 ReadString
方法 return 也是终止该行的 \n
,这是 ParseInt
函数的无效字符。
您可以使用以下代码段检查真正的错误
i, err := strconv.ParseInt(line, 10, 64)
if err != nil {
switch err.(*strconv.NumError).Err {
case strconv.ErrSyntax:
fmt.Println("syntax error")
case strconv.ErrRange:
fmt.Println("out of range value")
}
}
建议:使用 strings.TrimSpace
清理您的输入。
我正在处理一个包含整数列表作为字符串的输入文件
10
..
我选择用ReadString('\n')方法逐行阅读
下面的代码
line, error := inputReader.ReadString('\n')
lineStr := string(line)
控制台输出(长度和值)
lineStr %v 4
lineStr %v 10
lineStr 的长度为“4”,可能是因为符文编码。
然后我尝试了几种方法将其转换为简单整数,但都没有成功。
Ex1
num, _ := strconv.ParseUint(lineStr, 0, 64)
输出一个数字 0(应该是 10)
Ex2
num, _ := strconv.Atoi(lineStr)
输出一个数字 0(应该是 10)
Ex3
num, _ := strconv.Atoi("10")
输出数字 10(确定)
Ex4
num, _ := strconv.ParseUint("10", 0, 64)
输出数字 10(确定)
文字中的字符串可以,但文件中的字符串不起作用,有什么问题吗?
提前致谢
如果您查看 ReadString
的文档,您会注意到返回的 string
将包含分隔符(在您的情况下为 \n
)。
ReadString reads until the first occurrence of delim in the input, returning a string containing the data up to and including the delimiter.
并且因为读取 10 之后的行的长度是 4,所以我假设这些行由 \r\n
分隔。删除它的最简单方法是使用 Trim
函数之一(如 TrimSpace)。
来自文档:"ReadString reads until the first occurrence of delim in the input, returning a string containing the data up to and including the delimiter."
因此,我建议您使用扫描仪,它可以像您期望的那样处理这种情况:
scanner := bufio.NewScanner(file)
for scanner.Scan() {
lineStr := scanner.Text()
num, _ := strconv.Atoi(lineStr)
fmt.Println(lineStr, num)
}
引用 bufio.Reader.ReadString 的文档(强调我的):
的文档ReadString reads until the first occurrence of delim in the input, returning a string containing the data up to and including the delimiter.
The errors that ParseInt returns have concrete type *NumError and include err.Num = s. If s is empty or contains invalid digits, err.Err = ErrSyntax and the returned value is 0
你的问题是 ReadString
方法 return 也是终止该行的 \n
,这是 ParseInt
函数的无效字符。
您可以使用以下代码段检查真正的错误
i, err := strconv.ParseInt(line, 10, 64)
if err != nil {
switch err.(*strconv.NumError).Err {
case strconv.ErrSyntax:
fmt.Println("syntax error")
case strconv.ErrRange:
fmt.Println("out of range value")
}
}
建议:使用 strings.TrimSpace
清理您的输入。