首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何将对象列表转换为csv?

如何将对象列表转换为csv?
EN

Stack Overflow用户
提问于 2010-02-22 01:19:04
回答 7查看 25.6K关注 0票数 18

如果我有一个名为“Car”的对象列表:

代码语言:javascript
复制
public class Car
{
     public string Name;
     public int Year;
     public string Model;
}

如何将对象列表转换为csv?

EN

回答 7

Stack Overflow用户

发布于 2010-02-22 01:35:41

将以下方法添加到Car中:

代码语言:javascript
复制
String Escape(String s)
{
    StringBuilder sb = new StringBuilder();
    bool needQuotes = false;
    foreach (char c in s.ToArray())
    {
        switch (c)
        {
            case '"': sb.Append("\\\""); needQuotes = true; break;
            case ' ': sb.Append(" "); needQuotes = true; break;
            case ',': sb.Append(","); needQuotes = true; break;
            case '\t': sb.Append("\\t"); needQuotes = true; break;
            case '\n': sb.Append("\\n"); needQuotes = true; break;
            default: sb.Append(c); break;
        }
    }
    if (needQuotes)
        return "\"" + sb.ToString() + "\"";
    else
        return sb.ToString();
}

public void SerializeAsCsv(Stream stream)
{
    stream.Write(Escape(Name));
    stream.Write(",");
    stream.Write(Year.ToString());
    stream.Write(",");
    stream.Write(Escape(Model));
    stream.Write("\n");
}

现在,您可以序列化整个列表:

代码语言:javascript
复制
foreach (Car car in list)
{
    car.SerializeAsCsv(stream);
}
票数 9
EN

Stack Overflow用户

发布于 2010-02-22 01:23:06

看看FileHelpers库。

从该站点:

The FileHelpers are a free and easy to use .NET library to import/export data from fixed length or delimited records in files, strings or streams.

这将确保按照RFC-4180正确处理行终止、转义等方面的各种陷阱。

票数 8
EN

Stack Overflow用户

发布于 2015-02-03 21:00:45

我一直在寻找解决方案,但我找到的答案都不能满足我对简单性的追求。我意识到我已经用我的自动CRUD代码得到了答案。我重新调整了它的用途,并编写了以下代码:

代码语言:javascript
复制
using System.Reflection;
    /// <summary>
    /// Using a bit of reflection to build up the strings.
    /// </summary>
    public static string ToCsvHeader(this object obj)
    {
        Type type = obj.GetType();
        var properties = type.GetProperties(BindingFlags.DeclaredOnly |
                                       BindingFlags.Public |
                                       BindingFlags.Instance);

        string result = string.Empty;
        Array.ForEach(properties, prop =>
        {
            result += prop.Name + ",";
        });

        return (!string.IsNullOrEmpty(result) ? result.Substring(0, result.Length - 1) : result);
    }

    public static string ToCsvRow(this object obj)
    {
        Type type = obj.GetType();
        var properties = type.GetProperties(BindingFlags.DeclaredOnly |
                                       BindingFlags.Public |
                                       BindingFlags.Instance);

        string result = string.Empty;
        Array.ForEach(properties, prop =>
        {
            var value = prop.GetValue(obj, null);
            var propertyType = prop.PropertyType.FullName;
            if (propertyType == "System.String")
            {
                // wrap value incase of commas
                value = "\"" + value + "\"";
            }

            result += value + ",";

        });

        return (!string.IsNullOrEmpty(result) ? result.Substring(0, result.Length - 1) : result);
    }

这将为每个对象添加一个扩展方法。用法如下:

代码语言:javascript
复制
var burgers = new List<Cheeseburger>();
var output = burgers.ToCsvHeader();
output += Environment.NewLine;

burgers.ForEach(burger =>
{
    output += burger.ToCsvRow();
    output += Environment.NewLine;
});
var path = "[where ever you want]";
System.IO.File.WriteAllText(path, output);

上面可能有一种更好的方法来编写这两个方法,但这种方法非常适合我的情况。希望这能帮助到别人。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2306667

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档