Как получить имена столбцов DataTable при экспорте данных в CSV? - PullRequest
0 голосов
/ 06 марта 2020

У меня есть следующий код, который работает для экспорта больших объемов данных из DataTable в CSV. По какой-то причине столбцы DataTable не экспортируются вместе со строками.

Я что-то упустил в следующем коде? Разве столбцы DataTable не экспортируются автоматически при получении строк?

 private void ExportToCSV()
    {
        try
        {
            string delimiter = ",";
            DataTable dt = new DataTable();
            foreach (DataGridViewColumn col in dgvSearchFilter.Columns)
            {
                dt.Columns.Add(new DataColumn(col.Name, typeof(string)));
            }

            for (int i = 0; i < dgvSearchFilter.RowCount; i++)
            {
                DataRow dr = dt.NewRow();
                for (int j = 0; j < dt.Columns.Count; j++)
                {
                    dr[j] = dgvSearchFilter.Rows[i].Cells[j].Value;
                }
                dt.Rows.Add(dr);
            }

            string unique = DateTime.Now.ToString("yyyyMMddHHmmssffff");
            string fileName = "SQLQueryOutput_" + unique + ".csv";
            using (StreamWriter swr = new StreamWriter(File.Open(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), fileName), FileMode.CreateNew), Encoding.Default, 1000000))
            { 
                foreach (DataRow dr in dt.Rows)
                {
                    swr.WriteLine(string.Join(delimiter, dr.ItemArray));
                }
            }
            MessageBox.Show("Your file was generated and its ready for use.");
}

Ответы [ 3 ]

0 голосов
/ 06 марта 2020
private void ExportToCSV()
{
    string delimiter = ",";

    var columns = dgSearchFilter.Columns.Select(c => c.Name.Cointains(deliminter)?"\"" + c.Name + "\"": c.Name);
    string header = string.Join(delimiter, columns);

    var unique =  DateTime.Now.ToString("yyyyMMddHHmmssffff");
    using (var swr = new StreamWriter($"SQLQueryOutput_{unique}.csv"))
    {
        swr.WriteLine(header);

        var rows = dgvSearchFilter.Rows.Select(r => r.Cells.Select(c => c.Value.ToString()));
        foreach (var row in rows)
        { 
             var line = row.Select(r => r.Contains(delimiter) || r.Contains("\n")?"\"" + r + "\"":r);
             swr.WriteLine(string.Join(delimiter, line));
        }
    }

    MessageBox.Show("Your file was generated and its ready for use.");
}
0 голосов
/ 09 марта 2020

поэтому я изменил свой код согласно комментарию @Joel Coehoorn. Мне удалось экспортировать 1 000 000 строк данных менее чем за минуту (по крайней мере, файл 230 МБ)

Код выглядит следующим образом:

            var headers = dgvSearchFilter.Columns.Cast<DataGridViewColumn>();
            string delimiter = ",";
            DataTable dt = new DataTable();
            foreach (DataGridViewColumn col in dgvSearchFilter.Columns)
            {
                dt.Columns.Add(new DataColumn(col.Name, typeof(string)));
            }

            foreach (DataGridViewRow row in dgvSearchFilter.Rows)
            {
                DataRow dataRow = dt.NewRow();
                foreach (DataGridViewCell cell in row.Cells)
                {
                    if (row.Cells[cell.ColumnIndex].Value == null || row.Cells[cell.ColumnIndex].Value == DBNull.Value || String.IsNullOrWhiteSpace(row.Cells[cell.ColumnIndex].Value.ToString()))
                    {
                        dataRow[cell.ColumnIndex] = " ";
                    }
                    else
                    {
                        dataRow[cell.ColumnIndex] = cell.Value.ToString();
                    }
                }
                dt.Rows.Add(dataRow);
            }

            string unique = DateTime.Now.ToString("yyyyMMddHHmmssffff");
            string fileName = "SQLQueryOutput_" + unique + ".csv";
            using (StreamWriter swr = new StreamWriter(File.Open(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), fileName), FileMode.CreateNew), Encoding.Default, 1000000))
            {
                swr.WriteLine(string.Join(",", headers.Select(column => "\"" + column.HeaderText + "\"").ToArray()));
                foreach (DataRow dr in dt.Rows)
                {
                    var line = dr.ItemArray.Select(r => r.ToString().Contains(delimiter) || r.ToString().Contains("\n") ? "\"" + r + "\"" : r);
                    swr.WriteLine(string.Join(delimiter, line));
                }
            }

            MessageBox.Show("Your file was generated and its ready for use.");
0 голосов
/ 06 марта 2020

Как то так.

    private void ExportToCSV()
    {
        List<string> headers = new List<string>();
        try
        {
            string delimiter = ",";
            DataTable dt = new DataTable();
            foreach (DataGridViewColumn col in dgvSearchFilter.Columns)
            {
                dt.Columns.Add(new DataColumn(col.Name, typeof(string)));
                headers.Add(col.Name);
            }

            for (int i = 0; i < dgvSearchFilter.RowCount; i++)
            {
                DataRow dr = dt.NewRow();
                for (int j = 0; j < dt.Columns.Count; j++)
                {
                    dr[j] = dgvSearchFilter.Rows[i].Cells[j].Value;
                }
                dt.Rows.Add(dr);
            }

            string unique = DateTime.Now.ToString("yyyyMMddHHmmssffff");
            string fileName = "SQLQueryOutput_" + unique + ".csv";
            using (StreamWriter swr = new StreamWriter(File.Open(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), fileName), FileMode.CreateNew), Encoding.Default, 1000000))
            { 
                swr.WriteLine(string.Join(delimiter, headers));
                foreach (DataRow dr in dt.Rows)
                {
                    swr.WriteLine(string.Join(delimiter, dr.ItemArray));
                }
            }
            MessageBox.Show("Your file was generated and its ready for use.");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...