当前位置:  开发笔记 > 编程语言 > 正文

将通用列表转换为CSV字符串

如何解决《将通用列表转换为CSV字符串》经验,为你挑选了6个好方法。

我有一个整数值列表(List),并希望生成一个逗号分隔值的字符串.这是列表输出中的所有项目到单个逗号分隔列表.

我的想法...... 1.将列表传递给方法.2.使用stringbuilder迭代列表并附加逗号3.测试最后一个字符,如果是逗号,则删除它.

你的想法是什么?这是最好的方法吗?

如果我不仅要处理整数(我当前的计划),还要处理字符串,longs,double,bools等等,我的代码将如何变化?我想让它接受任何类型的列表.



1> jason..:

框架已经为我们做了很多事情.

List myValues;
string csv = String.Join(",", myValues.Select(x => x.ToString()).ToArray());

对于一般情况:

IEnumerable myList;
string csv = String.Join(",", myList.Select(x => x.ToString()).ToArray());

正如你所看到的,它实际上并没有什么不同.请注意,如果包含逗号,您可能需要实际包装x.ToString()引号(即"\"" + x.ToString() + "\"")x.ToString().

有关这方面略有变化的有趣读物:请参阅Eric Lippert博客上的Comma Quibbling.

注意:这是在.NET 4.0正式发布之前编写的.现在我们可以说

IEnumerable sequence;
string csv = String.Join(",", sequence);

使用过载String.Join(string, IEnumerable).此方法将自动将每个元素投影xx.ToString().


@ajeh:你可能错过了一个`using`语句.

2> Krishna..:

在3.5,我仍然能够做到这一点.它更简单,不需要lambda.

String.Join(",", myList.ToArray());



3> Whatsit..:

您可以创建一个可以在任何IEnumerable上调用的扩展方法:

public static string JoinStrings(
    this IEnumerable values, string separator)
{
    var stringValues = values.Select(item =>
        (item == null ? string.Empty : item.ToString()));
    return string.Join(separator, stringValues.ToArray());
}

然后你可以在原始列表上调用该方法:

string commaSeparated = myList.JoinStrings(", ");



4> João Angelo..:

你可以用String.Join.

String.Join(
  ",",
  Array.ConvertAll(
     list.ToArray(),
     element => element.ToString()
  )
);



5> Zain Ali..:

如果任何正文要转换自定义类对象列表而不是字符串列表,则使用类的csv行表示覆盖类的ToString方法.

Public Class MyClass{
   public int Id{get;set;}
   public String PropertyA{get;set;}
   public override string ToString()
   {
     return this.Id+ "," + this.PropertyA;
   }
}

然后,可以使用以下代码将此类列表转换为带有标题列的 CSV

string csvHeaderRow = String.Join(",", typeof(MyClass).GetProperties(BindingFlags.Public | BindingFlags.Instance).Select(x => x.Name).ToArray()) + Environment.NewLine;
string csv= csvHeaderRow + String.Join(Environment.NewLine, MyClass.Select(x => x.ToString()).ToArray());



6> Ali Umair..:

正如@Frank给出的链接中的代码从.NET通用列表创建一个CSV文件时,有一个小问题是,我修改了代码来结束每一行以摆脱它.希望它可以帮助某人.

/// 
/// Creates the CSV from a generic list.
/// ;
/// ;
/// The list.;
/// Name of CSV (w/ path) w/ file ext.;
public static void CreateCSVFromGenericList(List list, string csvCompletePath)
{
    if (list == null || list.Count == 0) return;

    //get type from 0th member
    Type t = list[0].GetType();
    string newLine = Environment.NewLine;

    if (!Directory.Exists(Path.GetDirectoryName(csvCompletePath))) Directory.CreateDirectory(Path.GetDirectoryName(csvCompletePath));

    if (!File.Exists(csvCompletePath)) File.Create(csvCompletePath);

    using (var sw = new StreamWriter(csvCompletePath))
    {
        //make a new instance of the class name we figured out to get its props
        object o = Activator.CreateInstance(t);
        //gets all properties
        PropertyInfo[] props = o.GetType().GetProperties();

        //foreach of the properties in class above, write out properties
        //this is the header row
        sw.Write(string.Join(",", props.Select(d => d.Name).ToArray()) + newLine);

        //this acts as datarow
        foreach (T item in list)
        {
            //this acts as datacolumn
            var row = string.Join(",", props.Select(d => item.GetType()
                                                            .GetProperty(d.Name)
                                                            .GetValue(item, null)
                                                            .ToString())
                                                    .ToArray());
            sw.Write(row + newLine);

        }
    }
}

推荐阅读
pan2502851807
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有