我有一个要从磁盘读取的 csv 文件。我不知道前面有多少列或列的名称。
关于我应该如何代表这些领域的任何想法。理想情况下,我想说的是,
字符串 Val = DataStructure.GetValue(i,ColumnName)。
其中 i 是第 i 行。
哦,顺便说一句,我将使用 TextFieldParser 类
http://msdn.microsoft.com/en-us/library/cakac7e6(v=vs.90).aspx进行解析
我有一个要从磁盘读取的 csv 文件。我不知道前面有多少列或列的名称。
关于我应该如何代表这些领域的任何想法。理想情况下,我想说的是,
字符串 Val = DataStructure.GetValue(i,ColumnName)。
其中 i 是第 i 行。
哦,顺便说一句,我将使用 TextFieldParser 类
http://msdn.microsoft.com/en-us/library/cakac7e6(v=vs.90).aspx进行解析
这听起来好像你需要 a DataTable
which has a Rows
andColumns
属性。
所以你可以说:
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;
}
}
如果列名在第一行,则读取并存储在Dictionary<string, int>
将列名映射到列索引的 a 中。
然后,您可以将剩余的行存储在一个简单的结构中,例如List<string[]>
.
要获得一行的列,你会做csv[rowIndex][nameToIndex[ColumnName]];
nameToIndex[ColumnName]
从名称中获取列索引,csv[rowIndex]
获取我们想要的行(字符串数组)。
这当然可以包含在一个类中。
如果您愿意,可以使用 csv 解析器,但如果您需要自定义,文本解析器很容易自己完成。
对于您的需要,我会使用一个(或多个)字典。至少有一个具有 PropertyString --> 列索引。如果需要,也许是反向一列索引-> PropertyString。
当我为 csv 解析文件时,我通常在解析时将结果放入一个列表中,然后出于速度原因将结果放入一个数组中(List.ToArray())。