我使用函式將資料表轉換為 CSV,并使用 File.WriteAllText 將其保存到檔案中。
private static string DataTableToCSV(DataTable dtable, char seperator)
{
StringBuilder sb = new StringBuilder();
for (int i = 0; i < dtable.Columns.Count; i )
{
sb.Append(dtable.Columns[i]);
if (i < dtable.Columns.Count - 1)
sb.Append(seperator);
}
sb.AppendLine();
foreach (DataRow dr in dtable.Rows)
{
for (int i = 0; i < dtable.Columns.Count; i )
{
sb.Append(dr[i].ToString());
if (i < dtable.Columns.Count - 1)
{
sb.Append(seperator);
}
}
sb.AppendLine();
}
return sb.ToString();
}
好吧,代碼正在運行。我的問題是,在 CSV 中,分隔符是“;”。現在,當然,當表中的字串包含分號時會發生錯誤。也許有一種優雅的方法來解決這個問題?
uj5u.com熱心網友回復:
我寫了一個小助手來格式化我的 CSV 的每一行。
private string FormatForCsv(string value) => value != null && value.Contains(';') ? value.Replace(value, "\"" value "\"") : value;
那么你可以使用以下方法實作:
sb.Append(FormatForCsv(dr[i]?.ToString()));
當然,您也可以對標題使用相同的內容。
我還在轉換dr[i]為字串時添加了一個空檢查,只是為了安全起見。
uj5u.com熱心網友回復:
您應該考慮使用庫來為您處理 CSV 部分。當前接受的答案在值包含分隔符時處理參考,但是當值包含或以引號字符開頭時會發生什么,或者如果值包含換行符呢?這種方法將創建一個無效的檔案。事實上的CSV 標準規定,當值包含分隔符或換行符時,欄位應該被參考,并且引號應該加倍以“轉義”它們。
有很多庫可以幫助解決這個問題,包括我的作者之一:Sylvan.Data.Csv。Sylvan 以非常簡單的方式處理您的場景:
using Sylvan.Data.Csv;
static string DataTableToCSV(DataTable dtable, char seperator)
{
using var sw = new StringWriter();
var opts = new CsvDataWriterOptions { Delimiter = seperator };
using var csvw = CsvDataWriter.Create(sw, opts);
csvw.Write(dtable.CreateDataReader());
return sw.ToString();
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/329516.html
標籤:C# 文件 数据表 视觉工作室-2019 字符串生成器
