我有一个我要从磁盘读取的CSV文件。我不知道有多少列或列的名称。
关于我应该如何代表领域的任何想法。理想情况下,我想说
字符串val = datactructure.getValue(i,columnName)。
我在哪里。
哦,依靠我将使用textfieldparser类解析
http://msdn.microsoft.com/en-us/library/cakac7e6(v = vs.90).aspx
听起来好像您需要具有Rows
和Columns
属性的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())。