Escribir un archivo CSV en .net

Tengo un requisito para exportar un conjunto de datos como un archivo CSV.

Pasé un tiempo buscando un conjunto de reglas y me di cuenta de que hay bastantes reglas y excepciones al escribir un archivo CSV.

http://knab.ws/blog/index.php?/archives/3-CSV-file-parser-and-writer-in-C-Part-1.html http://bytes.com/topic/c- sharp / answers / 236875-problems-streamwriter-output-csv http://social.msdn.microsoft.com/forums/en-US/csharpgeneral/thread/0073fcbb-adab-40f0-b768-4bba803d3ccd

Así que ahora no es un proceso simple de separar cadenas con comas, he buscado un escritor CSV existente ya sea de terceros o (con suerte!) Incluido en el .NET Framework.

Editar: Nuevo enlace: http://www.thinqlinq.com/Post.aspx/Title/LINQ-to-CSV-using-DynamicObject-and-TextFieldParser

TextFieldParser es un objeto VB (se puede hacer referencia desde C #) que analizará automáticamente los archivos CSV. 🙂

Me preguntaba si alguien conoce alguna biblioteca .Net (2.0 -> 3.5 y 4.0) que pueda usarse para generar un archivo CSV correctamente formateado.

Además, si hay algún conjunto de reglas para generar archivos CSV.

Hay muchos detalles de lectores CSV y análisis de archivos CSV, pero no tantos sobre escritura (vale, sé que es todo lo contrario: P).

http://www.codeproject.com/KB/database/CsvReader.aspx

Cualquier ayuda sería muy apreciada 🙂

Encontré otro artículo con algunas reglas más detalladas de CSV: http://www.creativyst.com/Doc/Articles/CSV/CSV01.htm

Una buena biblioteca de terceros es Linq-a-CSV (no la biblioteca de framework): http://www.codeproject.com/KB/linq/LINQtoCSV.aspx

Gracias por su ayuda a todos. He decidido que la mejor solución será crear una clase estática simple que haga el reemplazo especial del personaje (que Chris mencionó).

Si tuviera una necesidad de que Linq consultara mis archivos CSV, vería la implementación de Linq-a-CSV en CodeProjects.

Gracias de nuevo 🙂

Si hay alguna coma en su celda, rodee toda la celda con comillas dobles, por ejemplo:

cell 1,cell 2,"This is one cell, even with a comma",cell4,etc 

Y si quieres una comilla doble literal, haz dos, por ejemplo:

 cell 1,cell 2,"This is my cell and it has ""quotes"" in it",cell 4,etc 

En cuanto a las fechas, cumpla con el formato ISO, y debería estar bien (por ejemplo, aaaa-mm-dd hh: mm: ss)

CsvHelper (una biblioteca que mantengo) también disponible a través de NuGet.

CsvHelper puede escribir automáticamente sus objetos de clase en un archivo por usted.

 var myObj = new MyCustomClass { Prop1 = "one", Prop2 = 2 }; var streamWriter = // Create a writer to somewhere... var csvWriter = new CsvWriter( streamWriter ); // You can write a single record. csvWriter.WriteRecord( myObj ); // You can also write a collection of records. var myRecords = new List{ myObj }; csvWriter.WriteRecords( myRecords ); 

Me gustaría agregar que hay un RFC que especifica el formato CSV que es lo que consideraría como la fuente canónica.

He utilizado Filehelpers extensivamente y es bastante impresionante para generar CSV.

Aquí está la función que puede usar para generar una fila de archivo CSV desde la lista de cadenas (también se puede usar IEnumerable (Of String) o string array):

 Function CreateCSVRow(strArray As List(Of String)) As String Dim csvCols As New List(Of String) Dim csvValue As String Dim needQuotes As Boolean For i As Integer = 0 To strArray.Count() - 1 csvValue = strArray(i) needQuotes = (csvValue.IndexOf(",", StringComparison.InvariantCulture) >= 0 _ OrElse csvValue.IndexOf("""", StringComparison.InvariantCulture) >= 0 _ OrElse csvValue.IndexOf(vbCrLf, StringComparison.InvariantCulture) >= 0) csvValue = csvValue.Replace("""", """""") csvCols.Add(If(needQuotes, """" & csvValue & """", csvValue)) Next Return String.Join(",", csvCols.ToArray()) End Function 

Como creo, no será difícil convertir de VB.NET a C #)

Para conocer las especificaciones, consulte http://en.wikipedia.org/wiki/Comma-separated_values

Sé que dijiste que encontraste tu respuesta, pero solo quería dar tu voto a la biblioteca LINQtoCSV que mencionaste. Lo he usado en un par de proyectos y funciona muy bien para mantener limpio tu código de negocio y no preocuparte por detalles / peculiaridades del formato de archivo.

Tal vez en su caso específico no sea demasiado difícil escribir al exportador, pero lo bueno de esta biblioteca es que es bidireccional. Si se ve obligado a consumir CSV en el futuro, no se trata de un código adicional, o le proporciona una biblioteca coherente para usar en futuros proyectos.

Puede usar ODBC para leer y escribir archivos CSV (a través de OdbcConnection y una cadena de conexión adecuada). Esto debería ser razonablemente bueno para generar archivos CSV, y manejará cosas como cotizaciones para usted; sin embargo, me he encontrado con algunos problemas al usarlo para leer archivos CSV generados por otros progtwigs.

Otra regla para agregar a los demás: use las comas como separadores de campo en lugar de como terminadores de campo. La razón para esto es que una coma al final de una línea podría ser ambigua: ¿no tiene importancia o significa un valor NULL después de ella?

Encontré este enlace importante que es bastante limpio. Todavía no lo he probado, ¡te dejaré saber cómo va!

http://www.codeproject.com/KB/linq/LINQtoCSV.aspx

Mirando más de cerca, esta implementación esencialmente solo usa reglas básicas también:

caracteres especiales = \ n \ “y el carácter separador.

si encuentra caracteres especiales, rodee con comillas. Reemplazar cotización con comillas dobles.

Esencialmente las reglas que Chris mencionó. Creo que la manera más fácil de hacerlo es crear mi método de ayuda basado en las reglas simples y revisar según las necesidades del usuario.

¿Puedes usar una matriz de cadenas y luego concatenar usando:

 string out = ""; string[] elements = { "1", "2" }; foreach(string s in elements) { out += s + "," }; out = out.substring(0, out.Length-1);