簡體   English   中英

通過Linq上課的CSV文件

[英]CSV file to class via Linq

使用下面的代碼,在foreach ,我得到一個例外。

我在csv (第二行)上放置斷點,我展開結果,我看到2個條目沒問題。

當我在foreachcsv上做同樣的事情時,我得到了一個激動: can't read from closed text reader.

任何想法 ?

謝謝,

我的CSV文件:

A0;A1;A2;A3;A4
B0;B1;B2;B3;B4

編碼

var lines = File.ReadLines("filecsv").Select(a => a.Split(';'));
IEnumerable<IEnumerable<MyClass>> csv =
    from line in lines
    select (from piece in line
            select new MyClass
            {
                Field0 = piece[0].ToString(),
                Field1 = piece[1].ToString()
            }
    ).AsEnumerable<MyClass>();

foreach (MyClass myClass in csv)
    Console.WriteLine(myClass.Field0);
Console.ReadLine();

我的課 :

public class MyClass 
{
    public string Field0 { get; set; }
    public string Field1 { get; set; }
}

也許這樣的事情會給你你想要的東西:

var jobs = File.ReadLines("filecsv")
               .Select(line => line.Split(','))
               .Select(tokens => new MyClass { Field0 = tokens[0], Field1 = tokens[1] })
               .ToList();

您遇到的問題是您正在保存Enumerable ,這會延遲執行。 然后,您將通過調試器查看它,該調試器遍歷文件,完成所有工作並處理它。 然后你再試一次。

上面的代碼實現了您目前想要的,更清晰一些,並強制轉換為列表,因此懶惰的行為消失了。

另請注意,我無法看到您的第一from piece in line如何能夠正常工作。

Perhabs是因為LINQ不直接讀取所有項目,只是在需要時創建它讀取的連接。

你可以嘗試施放:

var lines = File.ReadLines("filecsv").Select(a => a.Split(';')).ToArray();

我懷疑它是yield關鍵字(在Select() )和內部文本閱讀器(在ReadLines )不是“同意”的組合。

將lines變量更改為var lines = File.ReadLines("filecsv").Select(a => a.Split(';')).ToArray();

那應該排序。

暫無
暫無

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

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