Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# CSV文件中的词典列表_C#_List_Linq_Dictionary - Fatal编程技术网

C# 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

我有如下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.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

一些警告
  • 您明确要求提供一个
    列表
    ,这就是我提供的答案。如果数据类适合您当前的场景,那么使用它(其属性与您期望找到的列相匹配)会更好

  • 您可能需要添加一些空检查并尝试捕获。为了简洁起见,我把它们从示例中省略了

  • 请注意,我的示例仅根据找到的头数来解析单元格。如果某些数据行的单元格数大于标题数,则将忽略这些单元格

  • LINQ也有类似的方法来解决这个问题,但我选择了
    foreach
    ,因为它更容易阅读,我认为理解算法的意图更重要

  • 如果您要解析一个巨大的CSV文件,最好使用
    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

    一些警告
  • 您明确要求提供一个
    列表
    ,这就是我提供的答案。如果数据类适合您当前的场景,那么使用它(其属性与您期望找到的列相匹配)会更好

  • 您可能需要添加一些空检查并尝试捕获。为了简洁起见,我把它们从示例中省略了

  • 请注意,我的示例仅根据找到的头数来解析单元格。如果某些数据行的单元格数大于标题数,则将忽略这些单元格

  • LINQ也有类似的方法来解决这个问题,但我选择了
    foreach
    ,因为它更容易阅读,我认为理解算法的意图更重要

  • 如果您要解析一个巨大的CSV文件,最好使用
    StreamReader
    逐行读取文件(这样您就不必一次将所有内容都放到内存中)
    File.ReadAllLines()
    对于“正常”大小的CSV文件足够有效

  • 如果任何一行的数据单元格少于标题,您将遇到
    indexoutfrange
    异常(换句话说,当
    cells.Length
    时发生)。如果遇到这种情况,则需要添加一个额外的检查,以确保仅在标头和单元格值都存在时分配值。但我在示例中省略了它,因为它会混淆(relati