如果有办法从DataTable或DataSet生成CSV文件,请告诉我?具体而言,无需手动迭代DataTable行和连接。
请帮忙
答案 0 :(得分:11)
有几种方法可以做到这一点。
最简单的一个(IMO)正在使用FileHelpers Library
FileHelpers.CsvEngine.DataTableToCsv(dataTable, filename);
答案 1 :(得分:3)
相对简单,紧凑且非常灵活的解决方案可以是以下扩展方法:
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)));
}
请注意,此解决方案可能会导致大量数据出现问题,在这种情况下,您应该对输出进行流式处理。引用和格式化当然会使代码更复杂。
答案 2 :(得分:2)
我希望,还有一种可行的方法:
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);
}
答案 3 :(得分:1)
所以这是一个相当离奇的解决方案,但它比大多数都更快,因为它使用了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 :(得分: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;
}
}