2011-01-13 19 views
19

Eventuali duplicati:
Writing a CSV file in .netBuono CSV Writer per C#?

ci sono dei buoni scrittori CSV per C#?

Non serve un lettore, solo uno scrittore.

+3

http://stackoverflow.com/questions/1941392/are-there-any-csv-readers-writer-libs-in-c specificamente, questo commento: http://stackoverflow.com/questions/ 1941392/sono-there-any-csv-reader-writer-libs-in-c/2094885 # 2094885 – CanSpice

+0

scusate il mio male. commento cancellato – Simon

risposta

45

Non c'è molto da esso, davvero ... ecco qualche codice che ho usato per diversi anni:

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' }; 
} 

È possibile utilizzare il metodo di fuga per garantire che i valori siano correttamente citati. Io uso questa classe in combinazione con un semplice lettore, ma lei ha detto che non è necessario che ...

Aggiornamento E 'semplice, ma c'è qualcosa di più string.Join. Tuttavia, è ancora possibile ottenere via con qualcosa di abbastanza semplice, se si dispone di una vasta gamma di values (e si utilizza C# 3+):

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

Non sarebbe più facile citare e scappare tutto? O è questo per conservare le dimensioni del file o qualcosa del genere? – mpen

+0

Puoi citare e scappare tutto, immagino, ma non è molto elegante. – harpo

+0

Per quanto il mio database SQL comprenda come importarlo, va tutto bene. – mpen

13

scrittura è abbastanza banale, ma le librerie può fare un sacco di cose belle per la tu. Come scrivere oggetti personalizzati.

Ecco un esempio di oggetti di scrittura CsvHelper (una libreria che gestisco).

// 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); 

Per impostazione predefinita, le convenzioni vengono utilizzate per scrivere le intestazioni. Questo è tutto configurabile.

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

Roba buona. Sono contento che sia facilmente iniettabile e anche mockable. – Ian1971

+0

Grande biblioteca, ha reso la costruzione di un csv da un oggetto così semplice. Raccomando 'using' anche se per operazioni IO. Un buon esempio di utilizzo trovato [qui] (https://stackoverflow.com/a/38088636/692942). – Lankymart