Estoy tratando de escribir en un csv
archivo fila por fila usando lenguaje C #. Aqui esta mi funcion
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 en el csv
archivo?
StringBuilder
luego hacer uno para salvar?Util.WriteCsv (mydatacollection, @"c:\temp\data.csv");
Respuestas:
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 hace 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í:
O algo por el estilo. Mi razonamiento es: no necesitará escribir en el archivo para cada elemento, solo abrirá la secuencia una vez y luego le escribirá.
Usted puede reemplazar
con
si desea mantener versiones anteriores de csv en el mismo archivo
C # 6
Si está utilizando c # 6.0, puede hacer lo siguiente
EDITAR
Aquí hay un enlace a una pregunta que explica qué
Environment.NewLine
hace.fuente
{2}
yEnvironment.NewLine
usar enAppendLine
lugar deAppend
System.Globalization.CultureInfo.CurrentCulture.TextInfo.ListSeparator
lugar de coma.Te recomiendo encarecidamente que vayas por la ruta más tediosa. Especialmente si el tamaño de su archivo es grande.
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 una secuencia abierta. Abrir \ cerrar un archivo dentro de un bucle provocará una caída del 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 se bloqueará con
OutOfMemoryException
Otra ventaja de mi solución es que puede implementar pausa / reanudación guardando la posición actual en los datos de entrada.
upd Colocado usando en el lugar correcto
fuente
using
declaración. De lo contrario, volverá a abrir el archivo una y otra vez.Escribir archivos csv a mano puede ser difícil porque sus datos pueden contener comas y líneas nuevas. Le sugiero que use una biblioteca existente en su lugar.
Esta pregunta menciona algunas opciones.
¿Hay alguna biblioteca de lectores / escritores CSV en C #?
fuente
Utilizo una solución de dos análisis, ya que es muy fácil de mantener.
fuente
File.AppendAllLines(filePath, lines, Encoding.ASCII);
lugar deFile.WriteAllText(filePath, csv.ToString());
Entonces, estoy haciendo algo muy complicado. Después de construir el csv usando StringBuilder, lo convierto en List <string> para obtener un IEnumerable para la llamada a AppendAllLines, que no aceptará csv.ToString () como parámetro:List<string> lines = new List<string>(); lines.Add(csv.ToString(0, csv.Length));
¿Tiene una mejor manera de hacer esto?En lugar de llamar cada vez
AppendAllText()
que pueda pensar en abrir el archivo una vez y luego escribir todo el contenido una vez:fuente
Simplemente use AppendAllText en su lugar:
El único inconveniente de AppendAllText es que arrojará un error cuando el archivo no exista, por lo que debe verificarseLo siento, momento rubio antes de leer la documentación . De todos modos, el método WriteAllText sobrescribe todo lo que se escribió anteriormente en el archivo, si el archivo existe.
Tenga en cuenta que su código actual no está usando líneas nuevas adecuadas, por ejemplo, en el Bloc de notas, verá todo como una línea larga. Cambie el código a esto para tener nuevas líneas adecuadas:
fuente
En lugar de reinventar la rueda, se podría usar una biblioteca.
CsvHelper
es ideal para crear y leer archivos csv. Sus operaciones de lectura y escritura se basan en la transmisión y, por lo tanto, también admiten operaciones con una gran cantidad de datos.Puede escribir su csv de la siguiente manera.
Como la biblioteca está utilizando la reflexión, tomará cualquier tipo y lo analizará directamente.
Si desea leer más sobre las configuraciones y posibilidades de las bibliotecas, puede hacerlo aquí .
fuente
fuente
.Replace(",", ";") + ','
?Manejo de comas
Para manejar comas dentro de valores cuando se usa
string.Format(...)
, lo siguiente me ha funcionado:Entonces, para combinarlo con la respuesta de Johan, se vería así:
Devolver archivo CSV
Si simplemente desea devolver el archivo en lugar de escribirlo en una ubicación, este es un ejemplo de cómo lo logré:
De un procedimiento almacenado
De una lista
Espero que esto sea útil.
fuente
Este es un tutorial simple sobre cómo crear archivos csv con C # que podrá editar y ampliar para satisfacer sus propias necesidades.
Primero necesitará crear una nueva aplicación de consola de Visual Studio C #, hay pasos a seguir para hacerlo.
El código de ejemplo creará un archivo csv llamado MyTest.csv en la ubicación que especifique. El contenido del archivo debe ser 3 columnas con nombre con texto en las primeras 3 filas.
https://tidbytez.com/2018/02/06/how-to-create-a-csv-file-with-c/
fuente
Es posible que solo tenga que agregar un avance de línea
"\n\r"
.fuente
Aquí hay otra biblioteca de código abierto para crear archivos CSV fácilmente, Cinchoo ETL
Para obtener más información, lea el artículo de CodeProject sobre el uso.
fuente
Una forma sencilla de deshacerse del problema de sobrescritura es usar
File.AppendText
para agregar una línea al final del archivo comofuente
string string_value = string.Empty;
fuente
Esto debería permitirle escribir un archivo csv de manera bastante simple. Uso:
fuente