Escribir datos en un archivo CSV en C#
Estoy intentando escribir en un csv
archivo 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 csv
archivo. 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 csv
archivo?
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.NewLine
hace.
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