我有一种情况需要从csv文件的每一列创建两个数组。如下所示,csv文件包含两列,每列有一个标题为“period”和“acceleration”的标题。
Period,Acceleration
0.01,0.6
0.05,0.82
0.1,1.26
0.15,1.403
0.2,1.383
我尝试使用以下代码,然后将其拆分为两个数组。但是,它没有用逗号分隔数字。
string[] allLines = File.ReadAllText(@"C:\ArsScale\Tars.csv").Split(',');
答案 0 :(得分:4)
static void getTwoArraysFromFile(string filein, ref double[] acc, ref double[] period)
{
string line;
List<double> p1 = new List<double>();
List<double> p2 = new List<double>();
System.IO.StreamReader file = new System.IO.StreamReader(filein);
while ((line = file.ReadLine()) != null)
try {
String[] parms = line.Trim().Split(',');
p1.Add(double.Parse(parms[1], CultureInfo.InvariantCulture));
p2.Add(double.Parse(parms[0], CultureInfo.InvariantCulture));
}
catch { }
acc = p1.ToArray();
period = p2.ToArray();
}
答案 1 :(得分:2)
IEnumerable<string[]> allLines = File.ReadAllLines(@"C:\ArsScale\Tars.csv").Select(x => x.Split(','));
这将读取文本文件中的所有行,然后拆分每一行。数据类型为IEnumerable
string[]
。要将其更改为string[][]
,只需在.ToArray()
声明后调用Select
。
这种方法快速而简单,但它绝对不会对输入进行验证。例如,CSV规范允许逗号存在于值内,只要它们被转义即可。如果您需要进行任何类型的验证,您需要查看CSV解析器,其中有很多。
如果您不需要验证,那么您对输入持肯定态度,并且不关心良好的错误处理,您可以使用以下内容:
var allLines = File.ReadAllLines(@"C:\ArsScale\Tars.csv").Select(x => x.Split(',').Select(y => double.Parse(y).ToArray())).ToArray();
这将为您提供double[][]
作为输出。
答案 2 :(得分:1)
使用StreamReader逐行读取csv。然后拆分每一行并将每个值添加到列表中。最后从列表中创建两个数组。
List<Double> periodList = new List<Double>();
List<Double> accelerationList = new List<Double>();
StreamReader file = new System.IO.StreamReader(@"C:\ArsScale\Tars.csv");
string line = file.ReadLine();
while ((line = file.ReadLine()) != null)
{
string[] data = line.Split(',');
periodList.Add(Convert.ToDouble(data[0]);
accelerationList.Add(Convert.ToDouble(data[1]);
}
Double[] periodArray = periodList.ToArray();
Double[] accelerationArray = accelerationList.ToArray();
答案 3 :(得分:0)
String.Split不是一种解析CSV字段的强大方法,因为它们可能包含字段等中的逗号
无论如何,您需要使用File.ReadAllLines
,而不是File.ReadAllText
File.ReadAllLines为您提供了一个字符串数组 - 每行1个。
然后,您可以遍历数组并复制到每个项目的其他2个数组。
示例:
var lines = File.ReadAllLines (@"C:\ArsScale\Tars.csv");
var periods = lines.Skip(1).Select(x => x.Split(",")[0]).ToArray();
var accelerations = lines.Skip(1).Select(x => x.Split(",")[1]).ToArray();
但是我建议采用更强大的方法。
看一下这篇文章:http://www.codeproject.com/Articles/415732/Reading-and-Writing-CSV-Files-in-Csharp