¿Hay bibliotecas de lectores / escritores de CSV en C #? [cerrado]

111

¿Hay bibliotecas de lectores / escritores de CSV en C #?

mrblah
fuente
68
Siento disentir. Esta es definitivamente una pregunta constructiva y el primer resultado en Google para .net csv library. La evidencia, aunque anecdótica, de mi afirmación es que esta pregunta se ha visto más de 22000 veces en los últimos seis años.
shovavnik
5
verdadero dicho - primer éxito en Google
Robetto

Respuestas:

107

Pruebe CsvHelper . Es tan fácil de usar como FastCsvReader y también escribe. He estado muy contento con FastCsvReader en el pasado, pero necesitaba algo que también escribiera y no estaba contento con FileHelpers.

Leyendo:

var csv = new CsvReader( stream );
var myCustomTypeList = csv.GetRecords<MyCustomType>();

Escritura:

var csv = new CsvWriter( stream );
csv.WriteRecords( myCustomTypeList );

Divulgación completa: soy el autor de esta biblioteca.

Josh Close
fuente
3
Gracias, Josh. Le di una oportunidad, y fue rápido y eficiente en memoria. Creo que la documentación podría mejorarse un poco para los usuarios nuevos, pero definitivamente fue suficiente.
Sam
¿Hay alguna manera de usar esta biblioteca sin un tipo personalizado para que pueda iterar a través de la cuadrícula de mi tabla (personalizada) y escribir el encabezado y luego pasar cada campo de fila? Solo estoy buscando una forma de evitar errores en los archivos (escapar correctamente, etc.).
u84six
Si. Puede utilizar WriteField. Consulte los documentos aquí joshclose.github.io/CsvHelper
Josh Close
1
@Zimano No es cierto. Puede leer campos individuales o incluso obtener una matriz de cadenas para la fila. Consulte la documentación. joshclose.github.io/CsvHelper
Josh Close
@JoshClose ¡Oh, es bueno escucharlo, gracias! Solo revisé la guía de introducción aquí: joshclose.github.io/CsvHelper/… y no incluía mi caso de uso. Debería haber buscado más, mis disculpas. Sin embargo, en esa página dice que usar un mapeo de algún tipo es la forma recomendada de usar CsvHelper. ¿Quizás podría ofrecer algunas estrategias de lectura alternativas en ese lugar? Por cierto,
eliminé
21

Hay un par de opciones, justo en el propio marco.

Una de las más fáciles es hacer referencia a Microsoft.VisualBasic y luego usar TextFieldParser . Es un lector de CSV completamente funcional en el marco principal.

Otra buena alternativa es utilizar conjuntos de datos para leer archivos CSV .

Reed Copsey
fuente
6
Siempre me pregunté por qué estaba en el ensamblado Microsoft.VisualBasic ... ¿Pensó MS que los desarrolladores de C # no usaban CSV?
Thomas Levesque
4
@Thomas: especialmente porque muchos desarrolladores de C # se estremecen ante la idea de incluir un ensamblado de VisualBasic en sus proyectos
2
Sí, hay muchas "golosinas" agradables ahí. Creo que es más porque VB tiene algunas construcciones de lenguaje que realmente no se consideraron en el marco originalmente, pero nunca habrían podido hacer que los usuarios de VB6 cruzaran sin implementarlas. Los espacios de nombres Devices y ApplicationServices tienen todo tipo de cosas útiles.
Reed Copsey
20
@ Roboto, cualquier desarrollador de C # que se avergüence de hacer referencia a Microsoft.VisualBasic en su proyecto es un snob ignorante del lenguaje. Peor aún, no entienden .NET en absoluto.
Ash
3
Otra joya de ensamblaje de VB es CopyDirectory: stackoverflow.com/questions/58744/…
17

Sebastien Lorion tiene un gran CSVlector de CodeProject llamado A Fast CSV Reader . Probablemente uno de los mejores para C # y es gratis.

En cuanto a la escritura, solo use StreamWriter.

Aquí hay un código repetitivo para escribir DataGridViewen un archivo:

private void exportDGVToCSV(string filename)
{
    if (dataGridView1.Columns.Count != 0) 
    {    
        using (Stream stream = File.OpenWrite(filename))
        {
            stream.SetLength(0);
            using (StreamWriter writer = new StreamWriter(stream))
            {
                // loop through each row of our DataGridView
                foreach (DataGridViewRow row in dataGridView1.Rows) 
                {
                    string line = string.Join(",", row.Cells.Select(x => $"{x}"));
                    writer.WriteLine(line);
                }

                writer.Flush();
            }
        };
    }
}
Matze
fuente
2
Esta es mi favorita. Gran biblioteca pequeña.
Alex
2
Escribir CSV es fácil: solo use un método de salida de texto normal y sepárelo con comas. Realmente solo necesita una biblioteca / controlador personalizado para leer ...
Reed Copsey
10
@Reed: no es demasiado trivial si desea que las comas y las comillas se escapen correctamente. Ni siquiera estoy seguro de si existe una estandarización para esto, pero es muy común hacerlo.
Stefan Steinegger
26
Escribir CSV es un poco más complejo que eso. Si los datos que desea que se expresen en el archivo CSV contienen comas o líneas nuevas, debe encerrar los datos entre comillas. Si hay una comilla en los datos recién marcados con comillas, entonces debe escapar de las comillas con comillas dobles. Ciertamente podría codificar esa lógica usted mismo, pero sería bueno que una biblioteca lo hiciera por usted.
Tinister
4
La estandarización es RFC 4180. tools.ietf.org/html/rfc4180
Josh Close
7

Sí, aunque supongo que en realidad estás pidiendo detalles.

Prueba FileHelpers

Murph
fuente
Bueno, lo hice, pero por alguna extraña razón FileHelpers se rompió al azar. Además, la biblioteca FileHelpers no se ha desarrollado durante mucho tiempo.
Erik Schierboom
1
FileHelpers se desarrollan activamente ahora, consulte GitHub .
xmedeko
3

Hay docenas.

http://www.filehelpers.net/ es uno de los más comunes.

Debo decir que los Filehelpers me parecen restrictivos en algunos escenarios y, en su lugar, uso The Fast CSV Reader . En mi experiencia, si no conoce el formato de su archivo CSV o la asignación de importación hasta el tiempo de ejecución, esta es la mejor biblioteca para usar.

Alex
fuente
También utilizamos filehelpers.
Tangurena
1
He encontrado que FileHelpers es una molestia para configurar. FastCsvReader fue mucho más fácil de usar.
Josh Close
+1 para FastCsvReader. Excelente actuación. Pero es principalmente un lector / analizador. No es un escritor.
Mehdi LAMRANI