簡體   English   中英

使用 FileHelpers 將動態 CSV 讀取到 DataTable

[英]Using FileHelpers to read a dynamic CSV to DataTable

我發現 FileHelpers 非常方便地處理“豐富的”CSV,具有自定義分隔符、帶引號的標識符、空項目過濾等。但它似乎主要是為了加載具有預先已知格式的文件以創建具有屬性的強類型對象列表用應該與標題匹配的屬性裝飾。

我的目的有點不同:我希望能夠以靈活的格式(如 DataTable 或某種字符串數組)加載自定義 CSV 文件,格式和列數事先未知。 旁注:我的 csv 來自 Stream,而不是來自物理文件。

我做了一些嘗試,使用ReadStreamAsDT中的FileHelperEngine等方法(完整實現如下),但遇到了一些問題。

  • 如果標頭包含無法出現在 C# 屬性中的空格或其他字符,則會引發異常“ The string 'My field' not is a valid .NET identifier ”。 我的標題可以包含所有類型的字符。
  • 它需要單獨手動解析標題行

我的實現顯示了上述問題:

using (var streamReader = new StreamReader(stream, true))
{   
    var cb = new DelimitedClassBuilder("temp", ";")
    {
        IgnoreFirstLines = 0,
        IgnoreEmptyLines = true,
        Delimiter = ";"
    };
    var headerArray = streamReader.ReadLine().Split(';');
    foreach (var header in headerArray)
    {
        cb.AddField(header, typeof(string));
        cb.LastField.FieldQuoted = true;
        cb.LastField.QuoteChar = '"';
    }

    var engineType = cb.CreateRecordClass();
    var engine = new FileHelperEngine(engineType);
    var datatable = engine.ReadStreamAsDT(streamReader);
}

我想避免導入另一個 CSV 包而不是 FileHelpers,並且由於我們稍后還需要使用相同的邏輯生成一些 CSV,因此我想避免為此編寫自己的代碼。

FileHelpers 文檔對我使用 DataTable 沒有多大幫助。

我還注意到像CommonEngine.CsvToDataTable()CsvEngine.CsvToDataTable()這樣的單行方法,但它旨在從物理文件中工作。

有沒有辦法通過 FileHelpers 來利用一些高級功能(安全報價處理、修剪、CSV 生成等)?

在我寫這個問題的時候,我剛剛編寫了自己的代碼來將 CSV 文件加載到具有我需要的所有功能的數據表中。

然而,還有另一種庫比FileHelpers,做一個更好的工作在這個領域,“CsvHelper”: https://joshclose.github.io/CsvHelper/https://joshclose.github.io/CsvHelper/examples/data-桌子/

using (var reader = new StreamReader("path\\to\\file.csv"))
using (var csv = new CsvReader(reader))
{
    // Do any configuration to `CsvReader` before creating CsvDataReader.
    using (var dr = new CsvDataReader(csv))
    {        
        var dt = new DataTable();
        dt.Load(dr);
    }
}

(如果您需要自定義分隔符等,只需設置分隔符)

或者,如果您願意,也可以手動完成: https : //github.com/JoshClose/CsvHelper/issues/1142#issuecomment-432910368如果您願意。

暫無
暫無

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

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