简体   繁体   English

从csv读取到对象[] C#

[英]read from csv to object[] C#

I am trying to read from a .csv file to an object array.我正在尝试从 .csv 文件读取到对象数组。

There are other solutions here that give solutions for lists but I cannot seem to make it work for me.这里还有其他解决方案可以为列表提供解决方案,但我似乎无法让它对我有用。

Object definition:对象定义:

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

Instance declaration:实例声明:

private DTOClass[] _dTOs;

Filter method:过滤方式:

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

Calling filter:调用过滤器:

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

I need this to return to an object array because it then goes into a CollectionView on a datagrid.我需要它返回到一个对象数组,因为它然后进入数据网格上的 CollectionView。

But I keep getting this error:但我不断收到此错误:

"Cannot implicitly convert type 'System.Collections.Generic.List[]' to 'MBM.Services.DTOClass[]'" “无法将类型 'System.Collections.Generic.List[]' 隐式转换为 'MBM.Services.DTOClass[]'”

I know that I'm obviously returning a list of a list, but I've tried other methods that are offered and I'm simply stumped.我知道我显然是在返回一个列表列表,但是我已经尝试了其他提供的方法,我只是被难住了。

I've also tried this:我也试过这个:

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

Calling with:打电话给:

DataTable csvData = GetDataTableFromCSVFile(Filename);

But this doesn't seem to return anything from the file.但这似乎没有从文件中返回任何内容。

Any help is appreciated, thanks.任何帮助表示赞赏,谢谢。

One simple way will be to split the lines and select them into your new object.一种简单的方法是拆分线条并将它们选择到您的新对象中。

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

There's no point in recreating the wheel, Id just use CsvHelper , it has support for what you're doing in addition to handling malformed CSV's you can additionally set up mapping like so:重新创建轮子没有意义,我只是使用CsvHelper ,它支持您正在做的事情,除了处理格式错误的 CSV 之外,您还可以像这样设置映射

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

Then you can get the object like so:然后你可以像这样获得对象:

var csv = new CsvReader( textReader );
var records = csv.GetRecords<MyClass>();

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM