我有一个包含数字和文本的文件。并且我正在尝试将所有数字都读为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
答案 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)