簡體   English   中英

Excel文本到C#數據表中的列等效

[英]Excel Text to Column Equivalent in C# Datatable

盡管在線存在幾種有關將CSV文件轉換為DataTable的C# methods ,但似乎沒有一種方法可以復制Excel - Convert Text to Columns 為了說明我的觀點,假設使用以下示例CSV

" FIRst row DATA T"
;;
"Excel versus Csharp" ; ; ; ;
; "MA"; "10000"; "20000"; ; "400000";;; ;; ;;;

"SECOND REPORTING" 
"1"; "20"; ; "";"";"";"";"";"";""; 

人們期望( 最好在string上沒有雙quotes )在DataTable獲得:

FIRst row DATA T


Excel versus Csharp
                 MA   10000   20000    40000  ...   

SECOND REPORTING
           1     20 ....

使用的方法

public static DataTable CSVQuoteToDataTable(string   
csvFilePath)
    {
        DataTable csvData = new DataTable();

        try
        {
            string[] seps = { "\";", ";\"" };
            char[] quotes = { '\"', ' ' };
            string[] colFields = null;
            foreach (var line in File.ReadLines(csvFilePath)) % targets unfortunately the 1st row as column of the DataTable
            {
                var fields = line
                    .Split(seps, StringSplitOptions.None)
                    .Select(s => s.Trim(quotes).Replace("\\\"", "\""))
                    .ToArray();

                if (colFields == null)
                {
                    colFields = fields;
                    foreach (string column in colFields)
                    {
                        DataColumn datacolumn = new DataColumn(column);
                        datacolumn.AllowDBNull = true;
                        csvData.Columns.Add(datacolumn);
                    }
                }
                else
                {
                    for (int i = 0; i < fields.Length; i++)
                    {
                        if (fields[i] == "")
                        {
                            fields[i] = null;
                        }
                    }
                    csvData.Rows.Add(fields);
                }
            }
        }

        catch (Exception ex)
        {

        }

       return csvData;
    }

對於更有效或更佳方法的反饋將不勝感激。

謝謝

我認為您可以使用Nuget擴展LumenWorksCsvReader來完成大部分所需的工作。 它將允許您使用逗號以外的定界符並處理引號(如果選擇,則不行)。

https://www.nuget.org/packages/LumenWorksCsvReader/

我看到的唯一問題是可變的列數,在這種情況下,您可能必須在代碼中處理它-確定最大列數並使用它。 當您嘗試讀取超出范圍的內容時,程序包將引發異常,並且看起來很笨拙,您只需為此添加try / catch即可。

裸露的骨頭,但是類似的東西應該可以幫助您入門。

using LumenWorks.Framework.IO.Csv;

using (StreamReader sr = new StreamReader(@"c:\cdh\foo.csv"))
{
    using (CsvReader reader = new CsvReader(sr, hasHeaders:false, delimiter:';', quote:'"'))
    {
        while (reader.ReadNextRecord())
        {
            for (int i = 0; i < maxFieldCount; i++)
            {
                try
                {
                    string val = reader[i];
                    // do something with 'val'
                }
                catch (Exception ex)
                {

                }
            }
        }
    }
}

暫無
暫無

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

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