Convertir DataSet \ DataTable a CSV

Por favor, avíseme, si hay alguna manera de generar archivos CSV desde un DataTable o DataSet? Para ser específicos, sin iterar manualmente a través de filas de DataTable y concatenar.

Por favor ayuda

Hay varias maneras de hacer eso.

Uno de los más simples (IMO) es usar la FileHelpers Library

 FileHelpers.CsvEngine.DataTableToCsv(dataTable, filename); 

Una solución relativamente simple, compacta y bastante flexible podría ser el siguiente método de extensión:

 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() .Select(i => string.Format(format, i.ItemArray))); } 

Tenga en cuenta que esta solución podría causar problemas con grandes cantidades de datos, en cuyo caso debe transmitir la salida. La cotización y el formato, por supuesto, harían el código más complejo.

Hay, espero, también una forma posible de hacer eso:

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

Así que esta es una solución bastante extraña, pero funciona más rápido que la mayoría ya que utiliza la serialización de la biblioteca JSON.net. Esto acelera la solución significativamente.

Pasos:

  1. Crear una matriz de cada nombre de columna en la tabla de datos, debe ser simple
  2. Use JSON.net para convertir datos en una cadena json

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

  3. Comience a utilizar la función Reemplazar en las cadenas c # y elimine la cadena json de todo el formato json.

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

  4. Luego use la matriz del paso 1 para eliminar todos los nombres de columna de la cadena json. Te quedan con una cadena de formato csv.

  5. Considere utilizar la matriz creada en el paso 1 para volver a agregar los nombres de columna como la primera fila en formato csv.

 //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; } }