IEnumerable to CSV ..在数组处理中

本文关键字:数组 处理 CSV to IEnumerable | 更新日期: 2023-09-27 18:30:42

我有一个'IEnumerable to CSV'扩展类。

我的源代码。

public static class CSVConverter
{   
    public static string ToCsv<T>(this IEnumerable<T> items) where T : class 
    { 
        var csvBuilder = new StringBuilder(); 
        var properties = typeof(T).GetProperties(); 
        csvBuilder.AppendLine(String.Join(",", properties.Select(p => p.Name.ToCsvValue()).ToArray())); 
        foreach (T item in items) 
        { 
            string line = String.Join(",", properties.Select(p => p.GetValue(item, null).ToCsvValue()).ToArray()); csvBuilder.AppendLine(line); 
        } 
        return csvBuilder.ToString();
    }
    private static string ToCsvValue<T>(this T item) where T : class
    {
        if (item == null) { return ""; }
        if (item is string)
        {
            return String.Format("'"{0}'"", item.ToString().Replace("'"", "'""));
        }
        double dummy;
        if (double.TryParse(item.ToString(), out dummy))
        {
            return String.Format("{0}", item);
        }
        return String.Format("'"{0}'"", item);
    }        
}

不包括数据转换的未处理数组条目。

示例代码

    public class Person
    {
        public string Name { get; set; }
        public string[] NickName { get; set; }
    }
    public void ConvertTest()
    {
        string csvData = new List<Person> {
            new Person
            {
                Name = "Harold",
                NickName = new string[] { "Bruce Lee", "Jackie Chan" }
            }
        }.ToCsv();
    }
csvData 是 "''"Name''",''"NickName''"''r''

n''"Harold''",''"System.String[]''"''r'"

转换测试 () 对数组项的结果不进行处理。

所以我想成为...

"System.String[]" --> "李小龙,成龙"

我该怎么做?

IEnumerable<T> to CSV ..在数组处理中

我不知道你需要什么格式,但 maybee 这会给出一些想法。

public static class CSVConverter
{
    public static string ToCsv<T>(this IEnumerable<T> items) where T : class
    {
        var csvBuilder = new StringBuilder();
        var properties = typeof(T).GetProperties();
        if (properties.Count() == 0)
        {
            csvBuilder.AppendLine(String.Join(",", items));
        }
        else
        {
            csvBuilder.AppendLine(String.Join(",", properties.Select(p => p.Name.ToCsvValue()).ToArray()));
            foreach (T item in items)
            {
                string line = String.Join(",", properties.Select(p => p.GetValue(item, null).ToCsvValue()).ToArray());
                csvBuilder.AppendLine(line);
            }
        }
        return csvBuilder.ToString();
    }
    private static string ToCsvValue<T>(this T item) where T : class
    {
        if (item == null) { return ""; }
        if (item is string)
        {
            return String.Format("'"{0}'"", item.ToString().Replace("'"", "'""));
        }
        if (item.GetType().IsArray)
        {
            return item.ToString() + "'"" + ((IEnumerable<T>)item).ToCsv() + "'"";
        }
        double dummy;
        if (double.TryParse(item.ToString(), out dummy))
        {
            return String.Format("{0}", item);
        }
        return String.Format("'"{0}'"", item);
    }
}

我添加了一个if (item.GetType().IsArray)来检查它是否是一个数组,然后迭代这些项目。

自我回答

        if (item is string[])
        {   
            IEnumerable<string> list = item as IEnumerable<string>;
            return String.Format("'"{0}'"", String.Join(",", list).Replace("'"", "'""));
        }

添加到 - 字符串 ToCsvValue(此 T 项),其中 T : 类