Преобразование DataSet\DataTable в CSV

Пожалуйста, дайте мне знать, есть ли способ сгенерировать CSV-файлы из DataTable или DataSet? Точнее, без ручной итерации строк DataTable и конкатенации.

Пожалуйста помоги

5 ответов

Решение

Есть несколько способов сделать это.

Один из самых простых (ИМО) использует FileHelpers Library

FileHelpers.CsvEngine.DataTableToCsv(dataTable, filename);

Относительно простым, компактным и достаточно гибким решением может быть следующий метод расширения:

public static string ToCsv(this DataTable table, string colSep = "", string rowSep = "\r\n")
{
    var format = string.Join(colSep, Enumerable.Range(0, table.Columns.Count)
                                            .Select(i => string.Format("{{{0}}}", i)));

    return string.Join(rowSep, table.Rows.OfType<DataRow>()
                                        .Select(i => string.Format(format, i.ItemArray)));
}

Обратите внимание, что это решение может вызвать проблемы с огромными объемами данных, и в этом случае вы должны передавать результаты. Цитирование и форматирование, конечно, сделают код более сложным.

//Dataset To Xls
ExportDataSetToCsvFile(DS,@"C:\\");

internal static void ExportDataSetToCsvFile(DataSet _DataSet, string DestinationCsvDirectory)
{
    try
    {
        foreach (DataTable DDT in _DataSet.Tables)
        {
            String MyFile = @DestinationCsvDirectory + "\\_" + DDT.TableName.ToString() + DateTime.Now.ToString("yyyyMMddhhMMssffff") + ".csv";//+ DateTime.Now.ToString("ddMMyyyyhhMMssffff")
            using (var outputFile = File.CreateText(MyFile))
            {
                String CsvText = string.Empty;

                foreach (DataColumn DC in DDT.Columns)
                {
                    if (CsvText != "")
                        CsvText = CsvText + "," + DC.ColumnName.ToString();
                    else
                        CsvText = DC.ColumnName.ToString();
                }
                outputFile.WriteLine(CsvText.ToString().TrimEnd(','));
                CsvText = string.Empty;

                foreach (DataRow DDR in DDT.Rows)
                {
                    foreach (DataColumn DCC in DDT.Columns)
                    {
                        if (CsvText != "")
                            CsvText = CsvText + "," + DDR[DCC.ColumnName.ToString()].ToString();
                        else
                            CsvText = DDR[DCC.ColumnName.ToString()].ToString();
                    }
                    outputFile.WriteLine(CsvText.ToString().TrimEnd(','));
                    CsvText = string.Empty;
                }
                System.Threading.Thread.Sleep(1000);
            }
        }
    }
    catch (Exception Ex)
    {
        throw Ex;
    }  
}

Я надеюсь, что есть и другой способ сделать это:

    static void Main(string[] args)
    {
        DataTable dt = new DataTable("MyTable");
        dt.Columns.Add("Id", typeof(int));
        dt.Columns.Add("Name", typeof(string));
        DataRow dr1 = dt.NewRow();
        dr1["Id"] = 1;
        dr1["Name"] = "John Smith";
        dt.Rows.Add(dr1);
        DataRow dr2 = dt.NewRow();
        dr2["Id"] = 2;
        dr2["Name"] = "John West";
        dt.Rows.Add(dr2);

        List<DataRow> list = dt.AsEnumerable().ToList();
        var strlist = from dr in list
                      select dr[0] + ", " + dr[1];
        var csv = string.Join(Environment.NewLine,strlist);
        Console.WriteLine(csv);
    }

Так что это довольно странное решение, но оно работает быстрее большинства, так как использует сериализацию библиотеки JSON.net. Это значительно ускоряет решение.

шаги:

  1. Создать массив каждого имени столбца в таблице данных, должно быть просто
  2. Используйте JSON.net для преобразования данных в строку json

    string json = JsonConvert.SerializeObject(dt, Formatting.None);

  3. Начните использовать функцию Replace для строк C# и удалите строку json из всех форматов json.

    json = json.Replace("\"", "").Replace("},{", "\n").Replace(":", "").Replace("[{", "").Replace("}]", "");

  4. Затем используйте массив из шага 1, чтобы удалить все имена столбцов из строки json. Вы остались со строкой в ​​формате CSV.

  5. Подумайте об использовании массива, созданного на шаге 1, чтобы добавить имена столбцов обратно в качестве первой строки в формате csv.

Другие вопросы по тегам