簡體   English   中英

CSV到對象模型映射

[英]CSV to object model mapping

我有一個CSV文件,我想讀入List。 這是一個示例文件:

Plant,Material,"Density, Lb/ft3",Storage Location
FRED,10000477,64.3008,3300
FRED,10000479,62.612,3275
FRED,10000517,90,3550
FRED,10000517,72,3550
FRED,10000532,90,3550
FRED,10000532,72,3550
FRED,10000550,97,3050

我知道我可以手動讀取CSV文件並使用普通的StreamReader構建列表,但我想知道是否有更好的方法,也許使用LINQ?

對於您問題中顯示的具體數據......

var yourData = File.ReadAllLines("yourFile.csv")
                   .Skip(1)
                   .Select(x => x.Split(','))
                   .Select(x => new
                                {
                                    Plant = x[0],
                                    Material = x[1],
                                    Density = double.Parse(x[2]),
                                    StorageLocation = int.Parse(x[3])
                                });

如果您已經為數據聲明了類型,則可以使用該類型而不是匿名類型。

請注意,此代碼是不穩健 它將無法正確處理包含逗號/換行符等的值,引用的字符串值或CSV文件中經常出現的任何其他深奧內容。

您可以使用這樣的簡單代碼,它會忽略標題但不能使用引號,但可能足以滿足您的需要。

from line in File.ReadAllLines(fileName).Skip(1)
let columns = line.Split(',')
select new
{
  Plant = columns[0],
  Material = int.Parse(columns[1]),
  Density = float.Parse(columns[2]),
  StorageLocation = int.Parse(columns[3])
}

或者您可以像其他人建議的那樣使用庫。

有一個代碼項目:

http://www.codeproject.com/KB/linq/LINQtoCSV.aspx

但是,您可能需要查看此處:

Linq和streamreader獲取線路

我寫了一個簡單的庫,允許開發人員在CSV文件上使用LINQ。 這是我的博客文章: http//procbits.com/2010/10/11/using-linq-with-csv-files/

在您的情況下,您必須將標題字符串更改為如下所示:

Plant,Material,DensityLbft3,StorageLocation

然后你可以像這樣解析文件:

var linqCSV = new CsvToXml("csvfile", true);
linqCsv.TextQualifier = null;

linqCsv.ColumnTypes.Add("Plant", typeof(string));
linqCsv.ColumnTypes.Add("Material", typeof(int));
linqCsv.ColumnTypes.Add("DensityLbft3", typeof(double));
linqCsv.ColumnTypes.Add("StorageLocation", typeof(int));

linqCsv.Convert();

然后你可以像這樣使用LINQ:

var items = from item in linqCsv.DynamicRecords
            where item.Plant == "Fred" && item.DensityLbft3 >= 62.6
            orderby item.StorageLocation
            select item;

希望對您有所幫助或有用。

它不使用LINQ,但CsvHelper是一種簡單的方法來實現對.NET對象的CSV解析:

using (TextReader txt = new StreamReader(filename))
{
    using (var csv = new CsvReader(txt))
    {
        var records = csv.GetRecords<PlantMaterial>();
        return records.ToList();
    }
}

使用Cinchoo ETL庫,可以將CSV文件解析為對象

定義類型匹配CSV文件結構如下

public class PlantType
{
    public string Plant { get; set; }
    public int Material { get; set; }
    public double Density { get; set; }
    public int StorageLocation { get; set; }
}

加載CSV文件

static void LoadCSV()
{
    using (var p = new ChoCSVReader<PlantType>("*** YOUR CSV FILE PATH ***")
        .WithFirstLineHeader(true)
        )
    {
        foreach (var rec in p)
        {
            Console.WriteLine(rec.Dump());
        }
    }
}

暫無
暫無

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

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