将数据集/数据表转换为 CSV
Posted
技术标签:
【中文标题】将数据集/数据表转换为 CSV【英文标题】:Converting DataSet/DataTable to CSV 【发布时间】:2011-06-20 12:57:09 【问题描述】:如果有任何方法可以从 DataTable 或 DataSet 生成 CSV 文件,请告诉我?具体而言,无需手动遍历 DataTable 行并进行连接。
请帮忙
【问题讨论】:
为什么你不想遍历 DataTable 的行?这将是非常简单的...... 我在寻找更快捷的方法。 您可以查看gist.github.com/riyadparvez/4467668 【参考方案1】://Dataset To Xls
ExportDataSetToCsvFile(DS,@"C:\\");
internal static void ExportDataSetToCsvFile(DataSet _DataSet, string DestinationCsvDirectory)
try
foreach (DataTable DDT in _DataSet.Tables)
String MyFile = @DestinationCsvDirectory + "\\_" + DDT.TableName.ToString() + DateTime.Now.ToString("yyyyMMddhhMMssffff") + ".csv";//+ DateTime.Now.ToString("ddMMyyyyhhMMssffff")
using (var outputFile = File.CreateText(MyFile))
String CsvText = string.Empty;
foreach (DataColumn DC in DDT.Columns)
if (CsvText != "")
CsvText = CsvText + "," + DC.ColumnName.ToString();
else
CsvText = DC.ColumnName.ToString();
outputFile.WriteLine(CsvText.ToString().TrimEnd(','));
CsvText = string.Empty;
foreach (DataRow DDR in DDT.Rows)
foreach (DataColumn DCC in DDT.Columns)
if (CsvText != "")
CsvText = CsvText + "," + DDR[DCC.ColumnName.ToString()].ToString();
else
CsvText = DDR[DCC.ColumnName.ToString()].ToString();
outputFile.WriteLine(CsvText.ToString().TrimEnd(','));
CsvText = string.Empty;
System.Threading.Thread.Sleep(1000);
catch (Exception Ex)
throw Ex;
【讨论】:
这个答案并不清楚它如何解决 OP 的问题。您应该编辑它以使其更清晰和更具可读性【参考方案2】:一个相对简单、紧凑且相当灵活的解决方案可能是以下扩展方法:
public static string ToCsv(this DataTable table, string colSep = "", string rowSep = "\r\n")
var format = string.Join(colSep, Enumerable.Range(0, table.Columns.Count)
.Select(i => string.Format("0", i)));
return string.Join(rowSep, table.Rows.OfType<DataRow>()
.Select(i => string.Format(format, i.ItemArray)));
请注意,此解决方案可能会导致大量数据出现问题,在这种情况下,您应该流式传输输出。引用和格式化当然会使代码更复杂。
【讨论】:
【参考方案3】:所以这是一个相当奇怪的解决方案,但它的运行速度比大多数都快,因为它利用了 JSON.net 库的序列化。这大大加快了求解速度。
步骤:
-
创建数据表中每个列名的数组,应该是
简单
使用 JSON.net 将数据表转换为 json 字符串
string json = JsonConvert.SerializeObject(dt, Formatting.None);
开始在 c# 字符串上使用 Replace 函数并去除 所有json格式的json字符串。
json = json.Replace("\"", "").Replace(",", "\n").Replace(":", "").Replace("[", "").Replace("]", "");
然后使用步骤 1 中的数组从 json字符串。剩下的是 csv 格式的字符串。
考虑使用在步骤 1 中创建的数组来添加列名 以 csv 格式作为第一行返回。
【讨论】:
【参考方案4】:我希望还有一种可能的方法:
static void Main(string[] args)
DataTable dt = new DataTable("MyTable");
dt.Columns.Add("Id", typeof(int));
dt.Columns.Add("Name", typeof(string));
DataRow dr1 = dt.NewRow();
dr1["Id"] = 1;
dr1["Name"] = "John Smith";
dt.Rows.Add(dr1);
DataRow dr2 = dt.NewRow();
dr2["Id"] = 2;
dr2["Name"] = "John West";
dt.Rows.Add(dr2);
List<DataRow> list = dt.AsEnumerable().ToList();
var strlist = from dr in list
select dr[0] + ", " + dr[1];
var csv = string.Join(Environment.NewLine,strlist);
Console.WriteLine(csv);
【讨论】:
我注意到的唯一缺点是,如果将来要添加更多列,我们需要连接 dt[Index],除非这看起来不错。【参考方案5】:有几种方法可以做到这一点。
其中一个最简单的 (IMO) 是使用 FileHelpers Library
FileHelpers.CsvEngine.DataTableToCsv(dataTable, filename);
【讨论】:
以上是关于将数据集/数据表转换为 CSV的主要内容,如果未能解决你的问题,请参考以下文章
MAINFRAME:在 JCL 中排序以将数据集转换为 CSV 格式