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



我有一个我要从磁盘读取的CSV文件。我不知道有多少列或列的名称。
关于我应该如何代表领域的任何想法。理想情况下,我想说

字符串val = datactructure.getValue(i,columnName)。
我在哪里。

哦,依靠我将使用textfieldparser类解析
http://msdn.microsoft.com/en-us/library/cakac7e6(v = vs.90).aspx

听起来好像您需要具有RowsColumns属性的DataTable

所以您可以说:

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

DataTable是内存数据的表。它可以强烈键入(如Field方法所建议的那样),但实际上它将其数据存储为内部的对象。

您可以使用此解析器将CSV转换为数据表。

编辑:我只是看到您要使用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;
    }
}

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

然后,您可以将剩余的行存储在List<string[]>等简单结构中。
要获得一行的列,您要做csv[rowIndex][nameToIndex[ColumnName]];

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

这当然可以包裹在班级中。

如果需要的话,请使用CSV解析器,但是如果您需要自定义,文本解析器很容易做。

对于您需要,我会使用一个(或更多)字典。至少一个具有propertyString->列索引。也许是反向一列索引 ->如果需要的话。

当我解析CSV的文件时,我通常在解析时将结果放在列表中,然后出于速度原因完成数组(list.toarray())。

最新更新