文本文件解析错误

本文关键字:错误 文件 文本 | 更新日期: 2023-09-27 18:09:25

我有一个100MB以上的这种格式的文本文件。这里是一个示例小文件。

and -0.436527 -0.515304 -0.002056 -0.227969 0.177528 0.201756...
with 0.101336 0.493859 -0.081095 -0.391502 -0.111579 0.388659...
voice -0.168610 0.413912 0.423446 0.484159 -0.546614 0.558571...

尾数可以是100+位,正负都可以。我使用这段代码根据某个建议进行解析(查找某个文本并对该文本的所有尾随数字求和)。

double[] vectorOne = File.ReadLines(filename)
                    .Where(line => line.Contains("drop"))
                    .SelectMany(line => line.Split())
                    .Where(str => str.All(c => Char.IsDigit(c) || c == '-' || c == '.'))
                    .Select(str => Double.Parse(str, CultureInfo.InvariantCulture))
                    .ToArray();
            MessageBox.Show( "", vectorOne.Sum().ToString());

但我得到以下错误:Input string was not in a correct format. at Double.Parse(str, CultureInfo.InvariantCulture)).

文本文件解析错误

你的问题就在这里:

.SelectMany(line => line.Split())

由于每行末尾都有一个空格,它也会为每行提供一个空条目(默认情况下Split不会删除空条目)

要避免这种情况,可以这样做:

.SelectMany(line => line.Split(new char[] { ' ' },StringSplitOptions.RemoveEmptyEntries))

我用你的output.bin文件试了一下,这次效果很好。

编辑:

double[] vectorOne = File.ReadLines("myOutput.bin")
                    .Where(line => line.Contains("drop"))
                    .Select(x => x.Trim())
                    .SelectMany(line => line.Split())
                    .Where(str => str.All(c => Char.IsDigit(c) || c == '-' || c == '.'))
                    .Select(str => Double.Parse(str, CultureInfo.InvariantCulture))
                    .ToArray();

这个方法也很有效,在分割行之前,你要先修剪行,去掉最后的空字符