从csv读取到object [] C#

时间:2018-07-24 08:22:34

标签: 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; }
}

实例声明:

private DTOClass[] _dTOs;

过滤方法:

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

呼叫过滤器:

DTO = File.OpenText(Filename).ReadLine().Select(v => FromCsv(v.ToString(), 
_restDto)).ToArray();

我需要返回到对象数组,因为它随后进入数据网格上的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;
}

致电:

DataTable csvData = GetDataTableFromCSVFile(Filename);

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

感谢您的任何帮助,谢谢。

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

重新创建转轮没有任何意义,只需使用CsvHelper,它就可以支持您正在做的事情,除了处理格式错误的CSV之外,您还可以像这样设置mapping

Fruits : Food

然后您可以像这样获得对象:

public sealed class MyClassMap : ClassMap<MyClass>
{
    public MyClassMap()
    {
        AutoMap();
        Map( m => m.CreatedDate ).Ignore();
    }
}