我正在尝试使用 Dart 从 CSV 文件中读取数据。我正在使用的代码从文件中读取行并使用 split() 方法将它们拆分为列。其中一列包含字符串格式的数字数据,我需要将其转换为双精度数。但是,当我尝试使用 double.parse() 方法解析字符串时,出现 FormatException: Invalid double 错误。 (字符串是“1.5”应该可以正常使用)
map[columns[5]] = (map[columns[5]] ?? 0) + double.parse(columns[3]);
这是显示的错误:
Reading from file: .\\test.csv
Unhandled exception:
FormatException: Invalid double
"1.5"
#0 double.parse (dart:core-patch/double_patch.dart:112:28)
#1 main (...)
#2 _delayEntrypointInvocation.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:295:33)
#3 _RawReceivePort._handleMessage (dart:isolate-patch/isolate_patch.dart:192:26)
我曾尝试使用 trim() 方法在解析字符串之前从字符串中删除任何空白字符,但错误仍然存在。我还检查了 CSV 文件中的数据,并确认它的格式正确为十进制数。
map[columns[5]] = (map[columns[5]] ?? 0) + double.parse(columns[3].trim());
错误信息:
FormatException: Invalid double "1.5"
表示您在字符串
double.parse
上调用"1.5"
,包括双引号字符。你必须先把它们脱掉。您可以通过多种不同的方式来做到这一点,例如:
String unquote(String s) =>
(s.length < 2 || !s.startsWith('"') || !s.endsWith('"'))
? s
: s.substring(1, s.length - 1);
void main() {
var s = '"1.5"';
print(s); // Prints: "1.5"
print(unquote(s)); // Prints: 1.5
print(double.parse(unquote(s))); // Prints: 1.5
}
或者更好的方法是使用适当的 CSV 解析器,它应该为您处理未引用的字段。请注意,如果您的 CSV 文件包含带有嵌入式逗号的字符串,那么天真地使用
String.split
可能会导致不正确的结果。 (我没有亲身使用过,不过package:csv
应该会合适吧。)