从 csv 读取到 object[] C#

Bit*_*ift 2 c# linq csv

我正在尝试从 .csv 文件读取对象数组。

这里还有其他解决方案为列表提供解决方案,但我似乎无法让它为我工作。

对象定义:

public class DTOClass
{
    //declare data members
    [DataMember]
    public DateTime Date { get; set; }
    [DataMember]
    public string stock_symbol { get; set; }
    [DataMember]
    public double stock_price_open { get; set; }
    [DataMember]
    public double stock_price_close { get; set; }
    [DataMember]
    public double stock_price_low { get; set; }
    [DataMember]
    public double stock_price_high { get; set; }
    [DataMember]
    public double stock_price_adj_close { get; set; }
    [DataMember]
    public long stock_volume { get; set; }
    [DataMember]
    public string stock_exchange { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

实例声明:

private DTOClass[] _dTOs;
Run Code Online (Sandbox Code Playgroud)

过滤方法:

private List<DTOClass> FromCsv(string csvLine, List<DTOClass> rest)
{
    DataTable _dt = new DataTable();

    string[] values = csvLine.Split(',');

    int j = _dt.Rows.Count;
    for (int i = 0; i < j; i++)
    {
        DTOClass dto = new DTOClass();

        dto.Date = Convert.ToDateTime(values[0]);
        dto.stock_symbol = Convert.ToString(values[1]);
        dto.stock_price_open = Convert.ToDouble(values[2]);
        dto.stock_price_close = Convert.ToDouble(values[3]);
        dto.stock_price_low = Convert.ToDouble(values[4]);
        dto.stock_price_high = Convert.ToDouble(values[5]);
        dto.stock_price_adj_close = Convert.ToDouble(values[6]);
        dto.stock_volume = Convert.ToInt64(values[7]);
        dto.stock_exchange = Convert.ToString(values[8]);

        rest.Add(dto);
    }

    return rest;
}
Run Code Online (Sandbox Code Playgroud)

呼叫过滤器:

DTO = File.OpenText(Filename).ReadLine().Select(v => FromCsv(v.ToString(), 
_restDto)).ToArray();
Run Code Online (Sandbox Code Playgroud)

我需要它返回一个对象数组,因为它然后进入数据网格上的 CollectionView 。

但我不断收到此错误:

“无法将类型‘System.Collections.Generic.List[]’隐式转换为‘MBM.Services.DTOClass[]’”

我知道我显然正在返回一个列表的列表,但我尝试过提供的其他方法,但我只是被难住了。

我也尝试过这个:

private static DataTable GetDataTableFromCSVFile(string csv_file_path)
{
    DataTable csvData = new DataTable();

    try
    {
        using (TextFieldParser csvReader = new TextFieldParser(csv_file_path))
        {
            csvReader.SetDelimiters(new string[] { "," });
            //csvReader.HasFieldsEnclosedInQuotes = true;
            string[] colFields = csvReader.ReadFields();

            foreach (string column in colFields)
            {
                DataColumn datecolumn = new DataColumn(column);
                datecolumn.AllowDBNull = true;
                csvData.Columns.Add(datecolumn);
            }

            while (!csvReader.EndOfData)
            {
                string[] fieldData = csvReader.ReadFields();
                //Making empty value as null
                for (int i = 0; i < fieldData.Length; i++)
                {
                    if (fieldData[i] == "")
                    {
                        fieldData[i] = null;
                    }
                }

                csvData.Rows.Add(fieldData);
            }
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }

    return csvData;
}
Run Code Online (Sandbox Code Playgroud)

呼叫方式:

DataTable csvData = GetDataTableFromCSVFile(Filename);
Run Code Online (Sandbox Code Playgroud)

但这似乎没有从文件中返回任何内容。

如有任何帮助,我们将不胜感激,谢谢。

Dra*_*rop 7

一种简单的方法是分割线并将它们选择到新对象中。

var result = File.ReadAllLines("pathTo.csv")
                .Select(line => line.Split(','))
                .Select(x => new MyObject { 
                    prop1 = x[0],
                    prop2 = x[1],
                    //etc.. 
                })
                .ToArray();
Run Code Online (Sandbox Code Playgroud)