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[]" --> "李小龙,成龙"
我该怎么做?
我不知道你需要什么格式,但 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 : 类