sql >> Database >  >> RDS >> Mysql

export grote datatable data naar .csv-bestand in c# windows-toepassingen

In plaats van StreamWriter.Write(..) . aan te roepen altijd kunt u overwegen een StringBuilder te gebruiken . Voeg alle strings toe aan Builder en schrijf maar één keer op de schijf !

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();

BEWERKEN

100000 rijen kostte me 271 ms en creëerde een bestand van ongeveer 18 MB

Zoals @aiodintsov opmerkte, kunnen/zullen er problemen zijn met het gebruik van StringBuilder als er meerdere MB's . zijn Van de gegevens. Dus ik heb een voorbeeld gemaakt volgens zijn opmerking. Werkte prima voor mij. 1 000 000 rijen geëxporteerd binnen 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. Hoe tel ik alleen het eerste voorkomen van een waarde?

  2. Een back-up van SQL Server 2000 herstellen op SQL Server 2012

  3. pghoard-alternatieven - PostgreSQL-back-upbeheer met ClusterControl

  4. Rails:FATAL - Peer-authenticatie mislukt voor gebruiker (PG::Error)