如何将CSV文件表示为C#程序中的数据结构

时间:2012-10-17 10:01:45

标签: c# data-structures

我有一个csv文件,我将从磁盘中读取。我不知道前面有多少列或列的名称 关于我应该如何代表这些领域的任何想法。理想情况下,我想说些什么,

string Val = DataStructure.GetValue(i,ColumnName)。
我是第i排。

哦,除此之外,我将使用TextFieldParser类解析 http://msdn.microsoft.com/en-us/library/cakac7e6(v=vs.90).aspx

3 个答案:

答案 0 :(得分:3)

听起来好像你需要一个RowsColumns属性的DataTable

所以你可以说:

string Val = table.Rows[i].Field<string>(ColumnName);

DataTable是内存数据表。它可以使用强类型(如Field方法所建议的那样),但实际上它将数据作为对象存储在内部。

您可以使用this parser将csv转换为DataTable。

修改:我刚刚看到你想要使用TextFieldParser。以下是将csv转换为DataTable的简单方法:

var table = new DataTable();
using (var parser = new TextFieldParser(File.OpenRead(path)))
{
    parser.Delimiters = new[]{","};
    parser.HasFieldsEnclosedInQuotes = true;
    // load DataColumns from first line 
    String[] headers = parser.ReadFields();
    foreach(var h in headers)
            table.Columns.Add(h);
    // load all other lines as data '
    String[] fields;
    while ((fields = parser.ReadFields()) != null)
    {
        table.Rows.Add().ItemArray = fields;
    }
}

答案 1 :(得分:0)

如果列名在第一行,请读取并存储在Dictionary<string, int>中,将列名映射到列索引。

然后,您可以将其余行存储在List<string[]>这样的简单结构中 要获取行的列,您需要执行csv[rowIndex][nameToIndex[ColumnName]];

nameToIndex[ColumnName]从名称中获取列索引,csv[rowIndex]获取我们想要的行(字符串数组)。

这当然可以包含在课堂上。

答案 2 :(得分:0)

如果需要,可以使用csv解析器,但如果需要自定义,则自己可以很容易地使用文本解析器。

根据您的需要,我会使用一个(或更多)Dictionnary。至少有一个拥有PropertyString - &gt;列索引。也许反向一列索引 - &gt;如果需要,可以使用PropertyString。

当我为csv解析一个文件时,我通常会在解析时将结果放在一个列表中,然后出于速度原因在一个数组中完成(List.ToArray())。