我正在将csv文件读入列表,这样文件中的每一行都是数组单元格,每个单元格都是一列列。 这是我的阅读鳕鱼:
public List<string[]> parseCSV(string path)
{
List<string[]> parsedData = new List<string[]>();
string[] fields;
TextFieldParser parser = new TextFieldParser(path);
parser.TextFieldType = FieldType.Delimited;
parser.SetDelimiters(",");
while (!parser.EndOfData)
{
fields = parser.ReadFields();
parsedData.Add(fields);
}
parser.Close();
return parsedData;
}
最后我得到了这个字符串数组列表。现在我希望从特定单元格读取特定值,并从parsedData中读取特定行。 我怎样才能做到这一点 ?
我的问题是我想要的“行”是一个字符串值,我要查找的值来自列号1和行值“key”。
答案 0 :(得分:2)
所以你有List<string[]>
但不知道如何从中访问特定的“行”或“列”?您只需要使用索引器。数组/列表为零索引:
string field3OfRow4 = parsedData[3][2]; // can cause an IndexOutOfRangeException
您必须处理行或列较少的情况。因此,请使用列表的Count
属性和数组的Length
属性:
if(parsedData.Count >= 4 && parsedData[3].Length >= 3)
{
// safe
string field3OfRow4 = parsedData[3][2];
}
你也可以使用循环。
答案 1 :(得分:1)
您可以根据以下索引访问列表和数组:
string specificValue = parsedData[row][col];
但更好的选择是为您的CSV项创建一个类。然后解析每一行并创建该类的对象,它将为您提供更大的灵活性。
List<MyCSVItem> list = new List<MyCSVItem>();
然后在解析时,您可以将string[]
传递给类构造函数并将对象添加到List<T>
while (!parser.EndOfData)
{
string[] fields = parser.ReadFields();
list.Add(new MyCSVItem(fields));
}
答案 2 :(得分:0)
让我们打破这个:
List<T> list
并使用T row = list[y-1]
访问元素(行)(从零开始)
T
代表string[]
,我们访问的元素包含:string field = row[x - 1]
List<string[]> rows = parseCSV("somePath");
//-----------
string[] fieldNames = rows[0]; //get first row
string firstFieldname = fieldNames[0]; //get first row's first column
//or shorter:
string firstFieldname = rows[0][0];
for(int r = 0 /*change to 1 to skip first row*/ ; r < rows.Count; r++) {
string[] entry = rows[r];
string firstColumn = entry[0];
if(firstColumn == "key") {
Console.WriteLine("Found 'key' in first column of row " + r);
}
}
List<string[]> rows = parseCSV("somePath");
for(int r = 1; r < rows.Count; r++) {
string[] entry = rows[r];
if(entry.Length != fieldNames.Length) {
throw new FieldAccessException("illegal field length at row " + r + ": " + entry.Length);
}
Console.WriteLine("Row " + r + " = {");
for(int f = 0; f < fieldNames.Length; f++) {
Console.WriteLine("\t" + fieldNames[f] + " = " + entry[f]);
}
Console.WriteLine("}");
}