【问题标题】:How to create a .csv file from a Dictionary<List, List<string>> in C#如何在 C# 中从 Dictionary<List, List<string>> 创建 .csv 文件
【发布时间】:2017-03-07 02:34:39
【问题描述】:

我有一个 Dictionary(List, List(string)) (抱歉,由于某种原因,这个编辑器不允许我输入 ) 如下所示:

Key: A --> Value:{1,2,3}
Key: B --> Value:{a,b,c}
Key: C --> Value:{Hi,Hello,Hola}

我想创建一个 .csv 文件,其标题对应于我的字典键,“列”对应于列表。

因此,例如,我的 csv 文件中的 First ' 列应该是: 列“A”,值为 1 2 3 我的 csv 文件中的第二个“列”应该是: 列“B”,值为 a b c 等。 (请注意,我希望保留列的顺序,但如果不是也可以)

或者换句话说,因为这将是一个逗号分隔的文件,所以第一个“行”(标题)应该是: A,B,C
第二行: 1, a , Hi 第三行: 2, b, Hello 和第 4 行: 3, c, Hola

在 C# 中实现这一目标的最佳方法是什么?我已经尝试先对此进行研究,但我似乎在网上看到的大多数建议似乎都没有使用 Dictionary(List, List(string)) 格式的字典。

感谢您的帮助。

【问题讨论】:

    标签: c# dictionary read.csv


    【解决方案1】:

    你可以试试这个:

     static void Main(string[] args)
        {
            //Sample data declaration
            Dictionary<string, List<string>> data = new Dictionary<string, List<string>>();
            data.Add("Hello", new List<string>{"1", "2", "4"});
            data.Add("Foo", new List<string> { "3", "4", "7" });
            data.Add("World", new List<string> { "3", "4", "7" });
    
            DicToExcel(data, @"D:\my.csv");
    
        }
    

    逻辑来了:

        public static void DicToExcel(Dictionary<string, List<string>> dict, string path)
        {
                //We will put all results here in StringBuilder and just append everything
                StringBuilder sb = new StringBuilder();
    
                //The key will be our header
                String csv = String.Join(",",
                       dict.Select(d => d.Key));
                sb.Append(csv + Environment.NewLine);
    
                //We will take every string by element position
                String csv1 = String.Join(",",
                       dict.Select(d => string.Join(",", d.Value.First().Take(1))));
                sb.Append(csv1 + Environment.NewLine);
    
                String csv2 = String.Join(",",
                       dict.Select(d => string.Join(",", d.Value.Skip(1).Take(1))));
                sb.Append(csv2+ Environment.NewLine);
    
                String csv3 = String.Join(",",
                     dict.Select(d => string.Join(",", d.Value.Skip(2).Take(1))));
                sb.Append(csv3);
    
                //Write the file
                System.IO.File.WriteAllText(path, sb.ToString());
    
        }
    

    结果是:

    Hello   Foo     World
    1       3       3
    2       4       4
    4       7       7
    

    【讨论】:

    • 不客气!如果这回答了您的问题,您现在也可以接受它作为其他人参考的答案@Nodame
    【解决方案2】:

    一种解决方案是将您的地图转换为列表列表。 外部列表对应于文件,内部列表对应于行。 一旦你有了输出就变得容易了。

    在您的示例中,新的数据结构将是:

    [[A,B,C]
     [1,a,Hi]
     [2,b,Hello]
     [3,c,Hola]]
    

    您的地图和数据上的一组嵌套循环将允许您进行转换。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多