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# 中将分隔字符串转换为字典<string,string>