我有一个包含大量数字的文件,每个索引有4个子编号
no1 no2 no3 no4
no1 no2 no3 no4
no1 no2 no3 no4
该文件是一个cvs文件,但是我需要将数字作为double类型读入数组并进行插值,所以我需要遍历该表。
到现在为止,我有这个,但是我被困住了,并且我不知道如何将文件转换为double值,所以我可以开始计算它们。有什么建议吗?
var filelines = from line in file.Skip(5)
select line.Split(';');
答案 0 :(得分:1)
您可以拆分该行,将每个部分解析为十进制,并使用SelectMany来展平结果:
file.Skip(5).SelectMany(line => line.Split(';').Select(decimal.Parse)).ToArray()
答案 1 :(得分:1)
如果你想要一个double[][]
,那么每行一个数组:
double d;
double[][] lineValues = file.Skip(5)
.Select(l => l.Split(new[]{';'}, StringSplitOptions.RemoveEmptyEntries))
.Where(arr => arr.Length == 4 && arr.All(s => double.TryParse(s, out d)))
.Select(arr => arr.Select(double.Parse).ToArray())
.ToArray();
答案 2 :(得分:0)
如果每行中都有某些值,比如说你的cvs数据存储有特定数量的字段,那么更聪明和强类型的移动就是首先为你的数据存储组成一个模型,根据你的信息提供的将是:
public class MyCVSModel {
public Double Number1 {get; set;}
public Double Number2 {get; set;}
public Double Number3 {get; set;}
public Double Number4 {get; set;}
}
现在,您可以:
public static IEnumerable<MyCVSModel> Converion(String FileName){
var AllLines = System.IO.ReadAllLines(FileName);
foreach(var i in AllLines){
var Temp = i.Split('\t'); // Or any other delimiter
if (Temp.Lenght >= 4){ // 4 is because you have 4 values in a row
List<Double> TryConversion = new List<Double>();
foreach(var x in Temp) {
if (IsDouble(x))
TryConversion.Add(Convert.ToDouble(x));
else
TryConversion.Add(0);
}
MyCVSModel Model = new MyCVSModel();
Model.Number1 = TryConversion[0];
Model.Number2 = TryConversion[1];
Model.Number3 = TryConversion[2];
Model.Number4 = TryConversion[3];
yield return Model;
}
}
}
public static Boolean IsDouble(String Value) {
Regex R = new Regex(@"^[0-9]*(?:\.[0-9]*)?$");
return R.IsMatch(Value);
}