D-Kishore Ответов: 4

экспорт большой объект DataTable данных .CSV-файл в C# приложений для Windows


Уважаемая Команда Экспертов,

Мне нужно экспортировать большие(более 50 лакхов) данные в файл .csv

Я использую приведенный ниже код, но это занимает много времени.

string strFilePath= @"C:\myCSVfile.csv";


public void CreateCSVFile(DataTable dtDataTablesList, string strFilePath)

    {
        // Create the CSV file to which grid data will be exported.

        StreamWriter sw = new StreamWriter(strFilePath, false);

        //First we will write the headers.

        int iColCount = dtDataTablesList.Columns.Count;

        for (int i = 0; i < iColCount; i++)
        {
            sw.Write(dtDataTablesList.Columns[i]);
            if (i < iColCount - 1)
            {
                sw.Write(",");
            }
        }
        sw.Write(sw.NewLine);

        // Now write all the rows.

        foreach (DataRow dr in dtDataTablesList.Rows)
        {
            for (int i = 0; i < iColCount; i++)
            {
                if (!Convert.IsDBNull(dr[i]))
                {
                    sw.Write(dr[i].ToString());
                }
                if (i < iColCount - 1)

                {
                    sw.Write(",");
                }
            }
            sw.Write(sw.NewLine);
        }
        sw.Close();
    }


Пожалуйста, дайте мне знать любой другой способ сделать это быстро.

Дайте мне решение, Пожалуйста.

С уважением

Santhosh Kumar Jayaraman

Если вы извлекаете datatable из базы данных, то вы можете сделать это в Storedproc, а не переносить его в пользовательский интерфейс.

D-Kishore

вы имели в виду, что мне нужно экспортировать данные в файл .csv с помощью storedproc

sahabiswarup

Хороший Вопрос!

4 Ответов

Рейтинг:
34

D-Kishore

Привет Эксперты,

Это мое окончательное решение для этого.

с помощью этого кода мы можем экспортировать 50 лакхов записей в csv-файл менее чем за 2 минуты.
использование объекта sqldatareader вместо объекта DataTable

private void button1_Click(object sender, EventArgs e)
        {
 
            Stopwatch swra = new Stopwatch();
            swra.Start();
            string NewconnectionString = "myCoonectionString";
            StreamWriter CsvfileWriter = new StreamWriter(@"D:\testfile.csv");
            string sqlselectQuery = "select * from Mytable";
            SqlCommand sqlcmd = new SqlCommand();
 
            SqlConnection spContentConn = new SqlConnection(NewconnectionString);
            sqlcmd.Connection = spContentConn;
            sqlcmd.CommandTimeout = 0;
            sqlcmd.CommandType = CommandType.Text;
            sqlcmd.CommandText = sqlselectQuery;
            spContentConn.Open();
            using (spContentConn)
            {
                using (SqlDataReader sdr = sqlcmd.ExecuteReader())
                using (CsvfileWriter)
                {
                    //This Block of code for getting the Table Headers
                    DataTable Tablecolumns = new DataTable();
 
                    for (int i = 0; i < sdr.FieldCount; i++)
                    {
                        Tablecolumns.Columns.Add(sdr.GetName(i));
                    }
                    CsvfileWriter.WriteLine(string.Join(",", Tablecolumns.Columns.Cast<datacolumn>().Select(csvfile => csvfile.ColumnName)));
                    //This block of code for getting the Table Headers

                    while (sdr.Read())
                    //based on your Table columns you can increase and decrese columns
                        YourWriter.WriteLine(sdr[0].ToString() + "," + sdr[1].ToString() + "," + sdr[2].ToString() + "," + sdr[3].ToString() + "," + sdr[4].ToString() + "," + sdr[5].ToString() + "," + sdr[6].ToString() + "," + sdr[7].ToString() + "," + sdr[8].ToString() + "," + sdr[9].ToString() + "," + sdr[10].ToString() + "," + sdr[11].ToString() + ",");
                       
                }
            }
           swra.Stop();
Console.WriteLine(swra.ElapsedMilliseconds);
}</datacolumn>


Спасибо за вашу помощь, особенно Лине.


zahid_4b1

это действительно помогло спасибо тебе чувак

Рейтинг:
2

Rohith Reddy Vadiyala

Простой способ-сохранить его в XML и открыть в EXCEL.
MSExcel может автоматически генерировать схему для xml.
Как только файл открыт в Excel, мы можем сохранить его в формате csv.
Это может быть дерьмо для вас.
Но это действительно экономит время и легко кодируется.

//code under export button_Click
        var ds = obj.Export();
        dset.WriteXml(@"D:\ExportExcelFiles\sample.xml");
        Label1.Text = @"File Downloaded to D:\ExportExcelFiles\sample.xml";


//Business logic code which is defined under some class..
SqlDataAdapter da = null;
    DataSet ds;
    public DataSet Export()
    {
        string qryString = "Select Category.CategoryName, Category.CategoryID, Item.ItemName, Item.Description, Item.TaxID, Item.HKU From Category Left Join Item ON Category.CategoryID=Item.CategoryID";
        con = new SqlConnection(conString);
        if (con.State == ConnectionState.Closed)
        { con.Open(); }
        cmd = new SqlCommand(qryString, con);
        ds= new DataSet();
        da = new SqlDataAdapter(cmd);
        da.Fill(ds);
        return ds;

    }


Спасибо,
Оптимизации памяти вашего устройства.


Рейтинг:
0

Eddy Vluggen

Подсчитайте количество процессоров. Создайте поток для каждого и разделите строки на потоки. Пусть каждый экспортирует в свой собственный файл, объедините файлы в конце. Добавьте хороший индикатор прогресса, и все готово.

FWIW; "лак" не является международно признанной суммой.


Рейтинг:
0

Eddy Jawed

Хммм? Не знаю, что происходит с приведенным выше кодом и почему он был опубликован таким образом, но он создает Datatable без всякой причины, поскольку позже он использует эту грязную объединенную конкатенацию столбцов из самого читателя. Кроме того, большая часть синтаксиса нуждается в исправлении.

Нехорошо вставлять дефектный код, который не работает, он огорчает других и тратит их время впустую.

Гораздо более простой способ-просто создать объект Streamreader и просто перебирать заполненный Datatable сам по себе.


using System;
using System.Linq;
using System.Data;
using System.IO;
using System.Data.SqlClient;
using System.Configuration;


namespace ExportSQLTableToExcel
{
    class Program
    {
        static void Main(string[] args)
        {
           
        string ExcelFileName = ConfigurationManager.AppSettings["ExcelFileName"];
        string FolderPath = ConfigurationManager.AppSettings["FolderPath"];
        string ConnectionString = ConfigurationManager.AppSettings["ConnectionString"];
            
            // create the reader 
            SqlConnection sqlConnection1 = new SqlConnection(ConnectionString);
            SqlCommand cmd = new SqlCommand();
            SqlDataReader reader;

            cmd.CommandText = " select *  FROM [dbo].[YourTable]";
            cmd.CommandType = CommandType.Text;
            cmd.Connection = sqlConnection1;

            sqlConnection1.Open();
            reader = cmd.ExecuteReader();

            //Create the datatable

            using (DataTable dt = new DataTable())
            {
                dt.Load(reader);
                Console.WriteLine(dt.Rows.Count);  //check its filled 

                //Create the Streamwriter

                StreamWriter CsvfileWriter = new StreamWriter(@"C:\testfile.csv");

                using (CsvfileWriter)
                {

                    //Use sting join methods to attach and write the columns 
                    CsvfileWriter.WriteLine(string.Join(",", 
                    dt.Columns.Cast<DataColumn>().Select(csvfile => 
                    csvfile.ColumnName)));

                    foreach (DataRow row in dt.Rows)
                    {
                        //Use sting join methods to attach and write and iterate 
                        //through the rows of the datatable
                        CsvfileWriter.WriteLine(string.Join(",", row.ItemArray));
                    }
                }
            }
           
            sqlConnection1.Close();

        }

    }
    
}


Richard Deeming

ШЕСТЬ ЛЕТ слишком поздно, и на этот вопрос уже есть принятый ответ.

Придерживайтесь ответов на недавние вопросы.