IEnumerable <T>到CSV文件

usr*_*986 12 .net c# linq csv

我从LINQ查询得到的结果为var类型 IEnumerable<T>

我想从LINQ的结果创建一个CSV文件

我从以下查询中获得结果

var r = from table in myDataTable.AsEnumerable()
        orderby table.Field<string>(para1)
        group table by new { Name = table[para1], Y = table[para2] }
        into ResultTable
        select new
        {
            Name = ResultTable.Key,
            Count = ResultTable.Count()
        };
Run Code Online (Sandbox Code Playgroud)

Pra*_*ana 18

检查一下

 public static class LinqToCSV
    {
        public static string ToCsv<T>(this IEnumerable<T> items)
            where T : class
        {
            var csvBuilder = new StringBuilder();
            var properties = typeof(T).GetProperties();
            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)
        {
            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);
        }
    }
Run Code Online (Sandbox Code Playgroud)

完整代码:Scott Hanselman的ComputerZen博客 - 从Linq到CSV


aba*_*hev 6

IEnumerable<string> lines = r.Select(x => String.Format("{0},{1}", r.Name, r.Count));
System.IO.File.WriteAllLines(path, lines);
Run Code Online (Sandbox Code Playgroud)

将产生:

name1,count1
name2,count2
...
Run Code Online (Sandbox Code Playgroud)

  • 请注意,如果字符串包含您的分隔符或引号(在本例中为逗号),则需要引用字符串并相应地转义内部引号.字符串中的换行符也只允许引用. (2认同)