从包含字符串和数字混合的文本文件中读取双数字

时间:2019-09-23 23:24:36

标签: c# linq

我有一个包含数字和文本的文件。并且我正在尝试将所有数字都读为double并将它们放在一维double数组中。

在文件中,某些行以 Space 开头。某些行还包含两个或三个数字。 该文件是从另一个我不想更改其输出格式的应用程序创建的。

文件中的数据就像打击,有些行以一些空格开头:

 110        ! R1
123.000753   ! Radian per s as R2
  600.0451  65     ! j/kg
 12000         ! 4 Number of iteration
 87.619    ! (min 20 and max 1000)

到目前为止,我的代码是:

 char[] splits = { ' ', '!' };
 var array = File.ReadAllLines(@"myfile.dat")
.SelectMany(linee => linee.Split(splits))
.Where(n => !string.IsNullOrWhiteSpace(n.ToString()))
.Select(n =>
 {
  double doub;
  bool suc = double.TryParse(n, out  doub);
  return new { doub, suc };
 }).Where( values=>values.suc).ToArray();

问题是我的代码还会读取第4行和第5行这样的描述中!之后的数字。

数组必须像这样:

  

110,123.000735,6000.0451,65,120000,87.619

但是在我的代码中是这样的:

  

110,123.000735,6000.0451,65,120000,4,87.619,20,1000

3 个答案:

答案 0 :(得分:1)

仅给出一个示例时,很难给出一个通用公式,但是以下示例适用于您的示例:

return File.ReadAllLines(@"myfile.dat")
    .Where(s => !String.IsNullOrWhiteSpace(s))
    .Select(s => s.Substring(0, s.IndexOf('!')).Split(new [] {' '}, StringSplitOptions.RemoveEmptyEntries))
    .SelectMany(s => s)
    .Select(s => Double.Parse(s));

答案 1 :(得分:1)

一种方法可能如下。

var lines = str.Split(new []{"!",Environment.NewLine},StringSplitOptions.RemoveEmptyEntries)
               .Where(x=> x.Split(new []{" "},StringSplitOptions.RemoveEmptyEntries).All(c=>double.TryParse(c, out _))).
               SelectMany(x=> x.Split(new []{" "},StringSplitOptions.RemoveEmptyEntries).Select(c=>double.Parse(c)));

答案 2 :(得分:1)

这是一个使用正则表达式的替代解决方案:

expensiveOp5(d1, d2.withStatus(Status.ACTIVE), d3)