Преобразование 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. Это значительно ускоряет решение.
шаги:
- Создать массив каждого имени столбца в таблице данных, должно быть просто
Используйте JSON.net для преобразования данных в строку json
string json = JsonConvert.SerializeObject(dt, Formatting.None);
Начните использовать функцию Replace для строк C# и удалите строку json из всех форматов json.
json = json.Replace("\"", "").Replace("},{", "\n").Replace(":", "").Replace("[{", "").Replace("}]", "");
Затем используйте массив из шага 1, чтобы удалить все имена столбцов из строки json. Вы остались со строкой в формате CSV.
Подумайте об использовании массива, созданного на шаге 1, чтобы добавить имена столбцов обратно в качестве первой строки в формате csv.