簡體   English   中英

使用 TextFieldParser 和 csv 文件中的 c# 獲取特定列的行值

[英]Get the values for rows for specific columns using TextFieldParser and c# from a csv file

我正在嘗試將 TextFieldParser 與 c# 一起使用來解析 csv 文件並獲取特定列的行值。

例如 csv 與..

Name,Age,Color,Sport
Tom,24,Blue,Football
Dick,21,Red,Hockey
Jane,19,Green,Basketball

string fullpath = "C:\myfile.csv"
using (TextFieldParser parser = new TextFieldParser(fullPath))
{
     parser.SetDelimiters(",");
     while (!parser.EndOfData)
     {
        // Processing row
        string[] fields = parser.ReadFields();
        int sportcount = 0;
        for (int i = 0; i < fields.Length; ++i)
        {
            string column = fields[i];
            DataColumn datecolumn = new DataColumn(column);
            datecolumn.AllowDBNull = true;
            if (column.Contains("Sport"))
            {
                Console.WriteLine("Found Sport at {0}", i);
                sportcount = i;
            }
        }
        string sportCol = fields[sportCount];

        // if that column contains a value
        if (!(sportCol.Equals("")) {
            // ignore the column header row
            if (parser.LineNumber > 2) {
                if (sportCol.Equals("Football")) {
                    Console.WriteLine("Found somebody playing football");
                }
            }
        }
    }
}

所以理想情況下,我想要一個包含 csv 文件中所有運動的列表或數組。 所以它應該包含(足球,曲棍球,籃球)。 請記住,實際的 csv 文件有數百列和數千行。

更新:我已將以上內容更新為適合我的內容。 通過在找到“運動”列時將 i 分配給變量,然后我可以在 csv 文件中搜索該列的值。

我想通過“嘗試”你的意思是你遇到過可以讀取 csv 的東西,而且你並不拘泥於它。 因此,我想指出如果您改為使用 CsvHelper 讀取此文件,它會是什么樣子:

public class Person
{
    public int Age { get; set; }
    public string Name { get; set; }
    public string Color { get; set; }
    public string Sport { get; set; }
}

//in a method somewhere
using var reader = new StreamReader("path\\to\\file.csv"));
using var csv = new CsvReader(reader, CultureInfo.InvariantCulture));

foreach(var person in  csv.GetRecords<Person>()){
    //put code here
    Console.WriteLine(person.Name);

}

實際的 csv 文件有數百列

您需要為每一列創建一個屬性

理想情況下,我想要一個包含 csv 文件中所有運動項目的列表或數組

每項運動的獨特清單?

而是這樣做:

csv.GetRecords<Person>().Select(p => p.Sport).Distinct().ToArray()

請記住,以這種方式讀取 CSV 是僅向前的,因此您不能在不將讀取器重置為文件開頭的情況下第二次調用 getRecords。 也許那時如果你還有更多事情要做,你應該:

var people = csv.GetRecords<Person>().ToList();

將其全部加載到 memory 然后你可以重復查詢:

people.Sum(p => p.Age); //sum of all ages
people.Avg(p => p.Age); //avg age
people.Count(p => p.Color == "Red"); //count of reds

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM