[英]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.