Escribir datos en un archivo CSV en C#

Resuelto rampuriyaaa asked hace 11 años • 16 respuestas

Estoy intentando escribir en un csvarchivo fila por fila usando el lenguaje C#. Aquí está mi función.

string first = reader[0].ToString();
string second=image.ToString();
string csv = string.Format("{0},{1}\n", first, second);
File.WriteAllText(filePath, csv);

Toda la función se ejecuta dentro de un bucle y cada fila debe escribirse en el csvarchivo. En mi caso, la siguiente fila sobrescribe la fila existente y, al final, obtengo un único registro en el archivo csv, que es el último. ¿ Cómo puedo escribir todas las filas del csvarchivo?

rampuriyaaa avatar Sep 12 '13 13:09 rampuriyaaa
Aceptado

ACTUALIZAR

En mis días ingenuos, sugerí hacer esto manualmente (era una solución simple a una pregunta simple), sin embargo, debido a que esto se está volviendo cada vez más popular, recomendaría usar la biblioteca CsvHelper que realiza todas las comprobaciones de seguridad, etc.

CSV es mucho más complicado de lo que sugiere la pregunta/respuesta.

Respuesta original

Como ya tienes un bucle, considera hacerlo así:

//before your loop
    var csv = new StringBuilder();

//in your loop
    var first = reader[0].ToString();
    var second = image.ToString();
    //Suggestion made by KyleMit
    var newLine = string.Format("{0},{1}", first, second);
    csv.AppendLine(newLine);  

//after your loop
    File.WriteAllText(filePath, csv.ToString());

O algo por el estilo. Mi razonamiento es: no será necesario escribir en el archivo para cada elemento, solo abrirá la secuencia una vez y luego escribirá en ella.

puedes reemplazar

File.WriteAllText(filePath, csv.ToString());

con

File.AppendAllText(filePath, csv.ToString());

si desea mantener versiones anteriores de csv en el mismo archivo

C#6

Si está utilizando C# 6.0, puede hacer lo siguiente

var newLine = $"{first},{second}"

EDITAR

Aquí hay un enlace a una pregunta que explica qué Environment.NewLinehace.

Johan avatar Sep 12 '2013 06:09 Johan

Te recomiendo encarecidamente que sigas el camino más tedioso. Especialmente si el tamaño de su archivo es grande.

using(var w = new StreamWriter(path))
{
    for( /* your loop */)
    {
        var first = yourFnToGetFirst();
        var second = yourFnToGetSecond();
        var line = string.Format("{0},{1}", first, second);
        w.WriteLine(line);
        w.Flush();
    }
}

File.AppendAllText()abre un nuevo archivo, escribe el contenido y luego cierra el archivo. Abrir archivos es una operación que requiere muchos recursos que escribir datos en un flujo abierto. Abrir o cerrar un archivo dentro de un bucle provocará una caída en el rendimiento.

El enfoque sugerido por Johan resuelve ese problema almacenando toda la salida en la memoria y luego escribiéndola una vez. Sin embargo (en el caso de archivos grandes) su programa consumirá una gran cantidad de RAM e incluso fallaráOutOfMemoryException

Otra ventaja de mi solución es que puede implementar pausar/reanudar guardando la posición actual en los datos de entrada.

arriba. Colocado usando en el lugar correcto

Pavel Murygin avatar Sep 12 '2013 06:09 Pavel Murygin