将CSV文件读取到两个数组c#

时间:2014-01-13 16:42:05

标签: c# csv

我有一种情况需要从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(',');

4 个答案:

答案 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