Mysql
 sql >> база данни >  >> RDS >> Mysql

експортирайте големи данни за таблици в .csv файл в c# приложения за Windows

Вместо извикване на StreamWriter.Write(..) през цялото време може да обмислите използването на StringBuilder . Добавете всички низове към Builder и запишете само веднъж на диска !

string filePath = @"e:\temp\test.csv";
string delimiter = ",";

#region init DataTable
DataTable dt = new DataTable();
dt.Columns.Add(new DataColumn("a", typeof(string)));
dt.Columns.Add(new DataColumn("b", typeof(string)));
dt.Columns.Add(new DataColumn("c", typeof(string)));
dt.Columns.Add(new DataColumn("d", typeof(string)));
dt.Columns.Add(new DataColumn("e", typeof(string)));
dt.Columns.Add(new DataColumn("f", typeof(string)));
dt.Columns.Add(new DataColumn("g", typeof(string)));
dt.Columns.Add(new DataColumn("h", typeof(string)));
dt.Columns.Add(new DataColumn("i", typeof(string)));
dt.Columns.Add(new DataColumn("j", typeof(string)));
dt.Columns.Add(new DataColumn("k", typeof(string)));
dt.Columns.Add(new DataColumn("l", typeof(string)));
dt.Columns.Add(new DataColumn("m", typeof(string)));
dt.Columns.Add(new DataColumn("n", typeof(string)));
dt.Columns.Add(new DataColumn("o", typeof(string)));
dt.Columns.Add(new DataColumn("p", typeof(string)));

for (int i = 0; i < 100000; i++)
{
    DataRow dr = dt.NewRow();
    for (int j = 0; j < dt.Columns.Count; j++)
    {
        dr[j] = "test" + i + " " + j;
    }
    dt.Rows.Add(dr);
}
#endregion

Stopwatch sw = new Stopwatch();
sw.Start();
StringBuilder sb = new StringBuilder();
foreach (DataRow dr in dt.Rows)
{
    sb.AppendLine(string.Join(delimiter, dr.ItemArray));
}
File.WriteAllText(filePath, sb.ToString());
sw.Stop();
Console.WriteLine(sw.ElapsedMilliseconds);
Console.ReadLine();

РЕДАКТИРАНЕ

100 000 реда ми отнеха 271 ms и създадох файл от около 18 MB

Както @aiodintsov посочи, може/ще има проблеми с използването на StringBuilder ако иманяколко MB на данни. Така че създадох пример според неговия коментар. Работеше добре за мен. Експортирани 1 000 000 реда в рамките на 2685 ms .

Stopwatch sw = new Stopwatch();
sw.Start();
using (StreamWriter swr = 
         new StreamWriter(File.Open(filePath, FileMode.CreateNew), Encoding.Default, 1000000))
         // change buffer size and Encoding to your needs
{
    foreach (DataRow dr in dt.Rows)
    {
        swr.WriteLine(string.Join(delimiter, dr.ItemArray));
    }
}
sw.Stop();
Console.WriteLine(sw.ElapsedMilliseconds);


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Премахнете напълно MySQL Ubuntu 14.04 LTS

  2. Въпрос за производителност:НА АКТУАЛИЗИРАНЕ НА ДУБЛИРАН КЛЮЧ срещу АКТУАЛИЗИРАНЕ (MySQL)

  3. Синхронизиране на данни между MySQL и MongoDB

  4. Отговорът на ajax данни винаги е 0 в php mysql

  5. MySQL:грешка във вашия SQL синтаксис ... близо до ключ ...?