【问题标题】:C# convert dictionary into CSV like stringC# 将字典转换为类似字符串的 CSV
【发布时间】: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);
    
  }

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

【问题讨论】:

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

标签: c# linq dictionary


【解决方案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;
    }
}

【讨论】:

    猜你喜欢
    • 2021-09-16
    • 1970-01-01
    • 2020-10-23
    • 2014-09-02
    • 1970-01-01
    • 1970-01-01
    • 2017-11-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多