将字符串数组转换为双数组
Converting string array to double array
我有一个包含很多数字的文件,每个索引有 4 个子数字
no1 no2 no3 no4
no1 no2 no3 no4
no1 no2 no3 no4
该文件是一个 cvs 文件,但我需要将数字读入 double 类型的数组并进行插值,因此我需要遍历 table.
直到现在我都有这个,但我被卡住了,我真的不知道如何很好地将文件转换为双精度值,所以我可以开始计算它们。有什么建议吗?
var filelines = from line in file.Skip(5)
select line.Split(';');
您可以拆分线,将每个部分解析为小数并使用 SelectMany 来展平结果:
file.Skip(5).SelectMany(line => line.Split(';').Select(decimal.Parse)).ToArray()
如果你想要一个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();
如果每一行都有特定的值,比如说你的 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);
}
我有一个包含很多数字的文件,每个索引有 4 个子数字
no1 no2 no3 no4
no1 no2 no3 no4
no1 no2 no3 no4
该文件是一个 cvs 文件,但我需要将数字读入 double 类型的数组并进行插值,因此我需要遍历 table.
直到现在我都有这个,但我被卡住了,我真的不知道如何很好地将文件转换为双精度值,所以我可以开始计算它们。有什么建议吗?
var filelines = from line in file.Skip(5)
select line.Split(';');
您可以拆分线,将每个部分解析为小数并使用 SelectMany 来展平结果:
file.Skip(5).SelectMany(line => line.Split(';').Select(decimal.Parse)).ToArray()
如果你想要一个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();
如果每一行都有特定的值,比如说你的 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);
}