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

本文关键字:字符串 数组 列表 | 更新日期: 2023-09-27 17:53:20

我以这种方式从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和行值的"键"。

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

所以你有一个List<string[]>,但不知道如何从它访问一个特定的"行"或"列" ?你只需要使用索引器。数组/列表的索引为0:

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

当然你也可以使用循环

您可以根据索引访问List和array,如:

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

让我们来分析一下:

  • 我们有一个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("}");
    }