开发者

Good CSV Writer for C#? [duplicate]

开发者 https://www.devze.com 2023-02-04 10:48 出处:网络
This question already has answers here: 开发者_运维知识库 Closed 10 years ago. Possible Duplicate:
This question already has answers here: 开发者_运维知识库 Closed 10 years ago.

Possible Duplicate:

Writing a CSV file in .net

Are there any good CSV writers for C#?

Don't need a reader, just writer.


There's not much to it, really... here's some code I've used for several years:

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

You can use the Escape method to ensure that values are properly quoted. I use this class in conjunction with a simple reader, but you said you don't need that...

Update It's simple, but there is more to it than string.Join. However, you can still get away with something pretty simple, if you have an array of values (and are using C# 3+):

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


Writing is fairly trivial, but libraries can do a lot of nice things for you. Such as writing out custom objects.

Here is an example of CsvHelper (a library I maintain) writing objects.

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

By default, conventions are used for writing the headers. This is all configurable.

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

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号