2011-01-13 18 views
19

Duplicar posible:
Writing a CSV file in .net¿Buen escritor CSV para C#?

¿Hay buenos escritores CSV para C#?

No necesita un lector, solo un escritor.

+3

http://stackoverflow.com/questions/1941392/are-there-any-csv-readers-writer-libs-in-c específicamente, este comentario: http://stackoverflow.com/questions/ 1941392/are-there-any-csv-readers-writer-libs-in-c/2094885 # 2094885 – CanSpice

+0

lo siento mal. comentario eliminado – Simon

Respuesta

45

No hay mucho a ella, de verdad ... aquí hay un código que he usado durante varios años:

public static class Csv 
{ 
    public static string Escape(string s) 
    { 
     if (s.Contains(QUOTE)) 
      s = s.Replace(QUOTE, ESCAPED_QUOTE); 

     if (s.IndexOfAny(CHARACTERS_THAT_MUST_BE_QUOTED) > -1) 
      s = QUOTE + s + QUOTE; 

     return s; 
    } 

    public static string Unescape(string s) 
    { 
     if (s.StartsWith(QUOTE) && s.EndsWith(QUOTE)) 
     { 
      s = s.Substring(1, s.Length - 2); 

      if (s.Contains(ESCAPED_QUOTE)) 
       s = s.Replace(ESCAPED_QUOTE, QUOTE); 
     } 

     return s; 
    } 


    private const string QUOTE = "\""; 
    private const string ESCAPED_QUOTE = "\"\""; 
    private static char[] CHARACTERS_THAT_MUST_BE_QUOTED = { ',', '"', '\n' }; 
} 

Se puede utilizar el método de escape para asegurar que los valores estén debidamente citados. Yo uso esta clase en conjunto con un simple lector, pero dije que no es necesario que ...

actualización Es muy sencillo, pero hay más a él que string.Join. Sin embargo, todavía puede salirse con algo bastante simple, si usted tiene una serie de values (y está usando C# 3 +):

string.Join(",", values.Select(Csv.Escape)); 
+0

¿No sería más fácil citar y escapar de todo? ¿O se trata de conservar el tamaño del archivo o algo así? – mpen

+0

Podría citar y escapar de todo, supongo, pero no es muy elegante. – harpo

+0

Mientras mi base de datos SQL comprenda cómo importarla, todo está bien. – mpen

13

La escritura es bastante trivial, pero las bibliotecas pueden hacer muchas cosas buenas para tú. Como escribir objetos personalizados.

Aquí hay un ejemplo de CsvHelper (una biblioteca que mantengo) escribiendo objetos.

// Custom object. 
public class MyCustomObject 
{ 
    public string StringProperty { get; set; } 
    public int IntProperty { get; set; } 
} 

// Writing the CSV file. 
var myCustomObjectList = new List<MyCustomObject> 
{ 
    new MyCustomObject { StringProperty = "one", IntProperty = 1 }, 
    new MyCustomObject { StringProperty = "two", IntProperty = 2 } 
}; 
var csv = new CsvHelper(File.OpenWrite("some-file.csv")); 
csv.Writer.WriteRecords(myCustomObjectList); 

De manera predeterminada, las convenciones se utilizan para escribir los encabezados. Esto es todo configurable.

// Output: 
StringProperty,IntProperty 
one,1 
two,2 
+0

cosas buenas. Me alegro de que sea fácilmente inyectable y burlable también. – Ian1971

+0

Gran biblioteca, hizo construir un csv desde un objeto tan simple. Sin embargo, recomendaría 'usar' para operaciones IO. Un buen ejemplo de uso encontrado [aquí] (https://stackoverflow.com/a/38088636/692942). – Lankymart

Cuestiones relacionadas