I have a Dictionary(List, List(string)) (apologies, for some reason, this editor is not allowing me to type <>) which looks like the following:
Key: A --> Value:{1,2,3}
Key: B --> Value:{a,b,c}
Key: C --> Value:{Hi,Hello,Hola}
I would like to create a .csv file with Headers corresponding to my dictionary Keys, and 'Columns' corresponding to the List's.
So, for instance, First 'column in my csv file should be: column 'A', with values 1 2 3 Second 'column' in my csv file should be: column 'B', with values a b c, etc.. (Note that I would prefer that the ordering of the columns be kept, but it is ok if it's not)
Or in other words, since this will be a Comma Separated File, the First 'Row' (Headers) should be:
A,B,C
2nd row:
1, a , Hi
3rd row:
2, b, Hello
and 4th row:
3, c, Hola
What is the best way to achieve this in C#? I have tried researching this first, but most suggestions I seem to see online seem to not use a dictionary in the format Dictionary(List, List(string)).
I appreciate the help.
You can try this:
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");
}
Here comes the logic:
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());
}
The result would be:
Hello Foo World
1 3 3
2 4 4
4 7 7