C#的优秀CSV编写器?

时间:2011-01-13 21:51:39

标签: c#

  

可能重复:
  Writing a CSV file in .net

C#有没有好的CSV编写器?

不需要读者,只需要作家。

2 个答案:

答案 0 :(得分:46)

没有多少,真的......这是我用了几年的一些代码:

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

您可以使用Escape方法确保正确引用值。我将这个课程与一个简单的读者结合使用,但你说你不需要......

更新这很简单,但它比string.Join更多。但是,如果你有一个values数组(并使用C#3 +),你仍然可以使用非常简单的东西:

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

答案 1 :(得分:13)

写作相当简单,但是图书馆可以为你做很多好事。比如写出自定义对象。

以下是CsvHelper(我维护的库)编写对象的示例。

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

默认情况下,约定用于编写标头。这都是可配置的。

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