C# 将字典转换为类似字符串的 CSV

Posted

技术标签:

【中文标题】C# 将字典转换为类似字符串的 CSV【英文标题】:C# convert dictionary into CSV like string 【发布时间】:2021-05-16 01:19:25 【问题描述】:

我有一本字典 Dictionary<string, List<string>> 我想按字母顺序按键排序并将其转换为可以写入 CSV 文件的字符串,其中键作为列标题,值作为该列的值。

我的排序字典看起来像:


"Name" : ["John", "Ciara", "Moses"],
"Age" : ["23", "16", "37"],
"State" : ["Alabama", "Florida", "New York"]

最终结果将如下所示:

Age,Name,State
23,John,Alabama
16,Ciara,Florida
37,Moses,New York

请问我如何在 C# 中实现这一点?

为清楚起见,这里有一个link 来说明任务的含义。

下面是我解决它的方法。我将字符串转换为以列标题为键的字典。我现在的问题是将字典转换回字符串格式。

public static string SortCsvColumns( string csv_data )
  
    var data = csv_data.Split(new string[]  Environment.NewLine , StringSplitOptions.None);
    var values = data.Skip(1).ToArray();
    var splittedValues = new List<List<string>>();
    
    var dataSet = data[0].Split(new string[] ",", StringSplitOptions.None).ToDictionary(x => x, x => new List<string>());
    
    for(int i = 0; i < values.Length; i++) 
    
      splittedValues.Add(values[i].Split(new string[]  "," , StringSplitOptions.None).ToList());
    
    
    for(int i = 0; i < splittedValues.Count(); i++) 
      var splittedValue = splittedValues[i];
      for(int j = 0; j < splittedValue.Count(); j++) 
        dataSet.Values.ElementAt(i).Add(splittedValue[j]);
      
    
    dataSet = dataSet.OrderBy(key => key.Key);
    
  

有人可以建议最好的方法吗?

【问题讨论】:

OrderBy 这里需要json吗?如果没有,最好展示实际的测试代码来设置测试数据,而不是不相关的数据结构 字典有什么乱序的?键(我们知道它们是无序的,因为它是字典)还是值? @00110001 实际上任务是对 csv 字符串进行排序。我似乎无法编辑我的问题。我所做的是将表字符串转换为字典,然后对其进行排序。现在我正在寻找可以将其转换回表格字符串的最佳方法。 @Enigmativity 键。但我现在关心的是把字典转换成我的问题格式的字符串 【参考方案1】:

首先,创建一个映射以按列标题对列重新排序:

var map = new StringReader(csv_data).ReadLine() // get header line
                                    .Split(';') // split into array of headers
                                    .Select((h, n) => new  header = h, OrigPos = n ) // remember original position
                                    .OrderBy(hn => hn.header, StringComparer.CurrentCultureIgnoreCase) // sort into new position
                                    .Select(hn => hn.OrigPos) // return just old position new new order
                                    .ToList();

然后将每个 CSV 行重新映射到新的顺序并重新组合成一个string

using var sr = new StringReader(csv_data);
var ans = String.Join("\n",
                      sr.ReadLines()
                        .Select(line => line.Split(';'))
                        .Select(columns => String.Join(";", map.Select(pos => columns[pos]))));

这需要TextReader 上的扩展方法来枚举TextReader 的行:

public static class StringReaderExt 
    public static IEnumerable<string> ReadLines(this TextReader sr) 
        string line;
        while ((line = sr.ReadLine()) != null)
            yield return line;
    

【讨论】:

以上是关于C# 将字典转换为类似字符串的 CSV的主要内容,如果未能解决你的问题,请参考以下文章

C# 如何将 CSV 转换为数组?

如何自动将csv转换为pandas?

c#中JSON字符串到CSV和CSV到JSON的转换

在 C# 中将分隔字符串转换为字典<string,string>

如何在 PySpark 中将字符串转换为字典 (JSON) 的 ArrayType

将字符串的csv转换为矩阵