C# CSV文件中的词典列表
我有如下csv文件:C# CSV文件中的词典列表,c#,list,linq,dictionary,C#,List,Linq,Dictionary,我有如下csv文件: col1;col2 val1;val2 val3;val4 我想创建字典列表,如下所示: [0] k:col1, v:val1 k:col2, v:val2 [1] k:col1, v:val3 k:col2, v:val4 或者你知道更好的方法?我必须迭代这个列表,字段(列)的数量是可变的。解决方案 这里有一个简化的方法来返回您想要的内容。我已经评论了每一步来解释这个方法。这些步骤本身应该足够容易理解 var lines = File.ReadAllL
col1;col2
val1;val2
val3;val4
我想创建字典列表,如下所示:
[0] k:col1, v:val1
k:col2, v:val2
[1] k:col1, v:val3
k:col2, v:val4
或者你知道更好的方法?我必须迭代这个列表,字段(列)的数量是可变的。解决方案
这里有一个简化的方法来返回您想要的内容。我已经评论了每一步来解释这个方法。这些步骤本身应该足够容易理解
var lines = File.ReadAllLines("c:\\myfile.csv");
//1. Read all headers
string[] columnHeaders = lines[0].Split(';');
//2. Instantiate your end result variable.
List<Dictionary<string, string>> linesAsDictionaries = new List<Dictionary<string, string>>();
//3. Process all lines (except the header row!)
foreach(var line in lines.Skip(1))
{
//3.1 Instantiate the resulting dictionary
var newDict = new Dictionary<string, string>();
//3.2 Split the data
var cells = line.Split(';');
//3.3 Add an entry for each retrieved header.
for (int i = 0; i < columnHeaders.Length; i++)
{
newDict.Add(columnHeaders[i], cells[i]);
}
//3.4 Add the dictionary to the resulting list
linesAsDictionaries.Add(newDict);
}
return linesAsDictionaries;
var lines=File.ReadAllLines(“c:\\myfile.csv”);
//1. 阅读所有标题
字符串[]columnHeaders=行[0]。拆分(“;”);
//2. 实例化最终结果变量。
列表行字典=新列表();
//3. 处理所有行(标题行除外!)
foreach(行中的变量行。跳过(1))
{
//3.1实例化生成的字典
var newDict=新字典();
//3.2拆分数据
var cells=line.Split(“;”);
//3.3为每个检索到的标题添加一个条目。
for(int i=0;i
一些警告
列表
,这就是我提供的答案。如果数据类适合您当前的场景,那么使用它(其属性与您期望找到的列相匹配)会更好foreach
,因为它更容易阅读,我认为理解算法的意图更重要StreamReader
逐行读取文件(这样您就不必一次将所有内容都放到内存中)File.ReadAllLines()
对于“正常”大小的CSV文件足够有效indexoutfrange
异常(换句话说,当cells.Length
时发生)。如果遇到这种情况,则需要添加一个额外的检查,以确保仅在标头和单元格值都存在时分配值。但我在示例中省略了它,因为它会混淆(相对简单的)底层算法- 第二个(重复的)头是否应该被忽略,而文件的其余部分仍然被正常解析李>
- 是否要同时存储这两个值?(这将意味着远离
方法)字典
- 是否要停止分析文件并引发异常
var lines = File.ReadAllLines("c:\\myfile.csv");
//1. Read all headers
string[] columnHeaders = lines[0].Split(';');
//2. Instantiate your end result variable.
List<Dictionary<string, string>> linesAsDictionaries = new List<Dictionary<string, string>>();
//3. Process all lines (except the header row!)
foreach(var line in lines.Skip(1))
{
//3.1 Instantiate the resulting dictionary
var newDict = new Dictionary<string, string>();
//3.2 Split the data
var cells = line.Split(';');
//3.3 Add an entry for each retrieved header.
for (int i = 0; i < columnHeaders.Length; i++)
{
newDict.Add(columnHeaders[i], cells[i]);
}
//3.4 Add the dictionary to the resulting list
linesAsDictionaries.Add(newDict);
}
return linesAsDictionaries;
var lines=File.ReadAllLines(“c:\\myfile.csv”);
//1. 阅读所有标题
字符串[]columnHeaders=行[0]。拆分(“;”);
//2. 实例化最终结果变量。
列表行字典=新列表();
//3. 处理所有行(标题行除外!)
foreach(行中的变量行。跳过(1))
{
//3.1实例化生成的字典
var newDict=新字典();
//3.2拆分数据
var cells=line.Split(“;”);
//3.3为每个检索到的标题添加一个条目。
for(int i=0;i
一些警告
列表
,这就是我提供的答案。如果数据类适合您当前的场景,那么使用它(其属性与您期望找到的列相匹配)会更好foreach
,因为它更容易阅读,我认为理解算法的意图更重要StreamReader
逐行读取文件(这样您就不必一次将所有内容都放到内存中)File.ReadAllLines()
对于“正常”大小的CSV文件足够有效indexoutfrange
异常(换句话说,当cells.Length
时发生)。如果遇到这种情况,则需要添加一个额外的检查,以确保仅在标头和单元格值都存在时分配值。但我在示例中省略了它,因为它会混淆(relati