2010-08-16 137 views
31

我有一個CSV文件,我想讀入列表。下面是一個例子文件:CSV到對象模型映射

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?

+0

要列出什麼?你有上課嗎?匿名類型好嗎? – svick 2010-08-16 22:02:26

+0

我有一個類表示csv中的數據。 – mpenrow 2010-08-16 22:04:39

回答

35

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

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]) 
} 

或者您可以像其他人一樣使用庫。

+3

這不適用於包含逗號的字符串數據。 – terphi 2012-11-24 23:00:14

+1

@terphi這將需要使用引號,就像我說的,我的代碼將無法正常工作。 – svick 2012-11-24 23:01:22

+0

對不起,我猜是我在偷看。 – terphi 2012-11-25 06:55:17

31

對於你的問題出具體的數據......

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文件中常見的任何其他深奧內容。

+0

我試圖找出列的方式:工廠,材料....可以在運行時定義,任何解決方案? – 2016-06-17 22:28:39

6

我寫了一個簡單的庫,允許開發人員在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; 

希望幫助或工程您。