2013-02-14 66 views
2

此问题与解析CSV无关。DataTable To CSV

使用下面的代码创建从一个DataTable
一个CSV,但它是缓慢
100行14列是4秒
有一个更快的方法?

StringBuilder sb = new StringBuilder(); 
bool first = true; 
int colCount = 0; 
foreach (DataColumn dc in DT.Columns) 
{ 
    if (first) first = false; else sb.Append(","); 
    sb.Append("\"" + dc.ColumnName + "\""); 
    colCount++; 
} 
sb.AppendLine(); 
foreach (DataRow dr in DT.Rows) 
{ 
    first = true; 
    for (int i = 0; i < colCount; i++) 
    { 
     if (first) first = false; else sb.Append(","); 
     sb.Append("\"" + dr[i].ToString().Trim() + "\""); 
    } 
    sb.AppendLine(); 
} 
return sb.ToString(); 

StringBuilder在这里不是问题。
负载i从0到100万的运行在300毫秒

StringBuilder sb = new StringBuilder(); 
Stopwatch sw = new Stopwatch(); 
sw.Start(); 
for (int i = 0; i < 1000000; i++) 
{ 
    sb.Append(i.ToString()); 
} 
sw.Stop(); 
Debug.Write(sw.ElapsedMilliseconds.ToString()); 
+0

可能重复(http://stackoverflow.com/questions/9642055/csv-parsing-options-with-net) – 2013-02-14 19:48:39

+1

@DourHighArch的问题是创造一个CSV。不解析。这个问题没有关于解析CSV的问题。 – Paparazzi 2013-02-14 20:09:01

+1

我唯一的意见是你正在将你的输出写入一个StringBuilder - 为什么不直接写入一个流呢? – Matt 2013-02-14 20:31:35

回答

-1

你有什么没有“伟大”的代码......我想大多数人会建议使用类似的CSVHelper NuGet包。不过,我也会说这个代码不是只有100行需要4秒的代码。获取数据表中的数据需要多长时间?我猜这就是大部分4秒钟的时间。

+0

4秒钟是从现有数据表中提取文本的时间。不是创建DataTable的时候。并告诉我CSVHelper如何读取DataTable。 – Paparazzi 2013-02-15 00:05:37

1

有更快的方式来做字符串连接和一些其他逻辑。使用字符串生成器来构建整个事物也可能是经济放缓的一部分。正如一些人所说,图书馆可能已经有了一些已经想到的东西,并且可能会更快地执行。

这里是一些代码使用CsvHelper(我写了)。

using(var dt = new DataTable()) 
{ 
    dt.Load(dataReader); 
    foreach(DataColumn column in dt.Columns) 
    { 
     csv.WriteField(column.ColumnName); 
    } 
    csv.NextRecord(); 

    foreach(DataRow row in dt.Rows) 
    { 
     for(var i = 0; i < dt.Columns.Count; i++) 
     { 
      csv.WriteField(row[i]); 
     } 
     csv.NextRecord(); 
    } 
} 

如果你有DataReader你甚至不必使用DataTable那么,这应该加快步伐有些太过。 [使用.NET CSV解析选项]的

var hasHeaderBeenWritten = false; 
while(dataReader.Read()) 
{ 
    if(!hasHeaderBeenWritten) 
    { 
     for(var i = 0; i < dataReader.FieldCount; i++) 
     { 
      csv.WriteField(dataReader.GetName(i)); 
     } 
     csv.NextRecord(); 
     hasHeaderBeenWritten = true; 
    } 

    for(var i = 0; i < dataReader.FieldCount; i++) 
    { 
     csv.WriteField(dataReader[i]); 
    } 
    csv.NextRecord(); 
}