如何从字符串数组列表中获取特定值

时间:2015-06-03 13:13:16

标签: c# list

我正在将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”。

3 个答案:

答案 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];
    

  • 根据要求,您可以通过以下方式在第1列中搜索“key”值:

    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);
        }
    }
    

  • 您可以像这样评估您的CSV内容:

    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("}");
    }