0

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

字符串 Val = DataStructure.GetValue(i,ColumnName)。
其中 i 是第 i 行。

哦,顺便说一句,我将使用 TextFieldParser 类
http://msdn.microsoft.com/en-us/library/cakac7e6(v=vs.90).aspx进行解析

4

3 回答 3

4

这听起来好像你需要 a DataTablewhich has a RowsandColumns属性。

所以你可以说:

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

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

您可以使用此解析器将 csv 转换为 DataTable。

编辑:我刚刚看到你想使用TextFieldParser. 这是将 csv 转换为 a 的一种可能的简单方法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;
    }
}
于 2012-10-17T10:08:23.253 回答
0

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

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

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

这当然可以包含在一个类中。

于 2012-10-17T10:07:32.893 回答
0

如果您愿意,可以使用 csv 解析器,但如果您需要自定义,文本解析器很容易自己完成。

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

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

于 2012-10-17T10:08:13.303 回答