我有一个csv文件,我将从磁盘中读取。我不知道前面有多少列或列的名称 关于我应该如何代表这些领域的任何想法。理想情况下,我想说些什么,
string Val = DataStructure.GetValue(i,ColumnName)。
我是第i排。
哦,除此之外,我将使用TextFieldParser类解析 http://msdn.microsoft.com/en-us/library/cakac7e6(v=vs.90).aspx
答案 0 :(得分:3)
听起来好像你需要一个Rows
和Columns
属性的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())。