【问题标题】:Save the content of several csv files into a searchable array C#将多个 csv 文件的内容保存到可搜索的数组 C#
【发布时间】:2020-03-05 22:02:04
【问题描述】:

这是Getting specific row and column value in .csv file in c# 的后续问题。

我在特定文件夹中有一堆 .csv 文件,我希望能够从中读取值:

cars.csv
planes.csv
tanks.csv

我想要做的是,对于我创建的csvfiles 类,将每个 csv 文件的内容存储在一个大数组中,就像我在提到的帮助下所拥有的一样以上:

  string[][] m_Data = File
    .ReadLines(@"c:\MyFile.csv")
    .Where(line => !string.IsNullOrWhiteSpace(line)) 
    .Skip(1)
    .Select(line => line.Split(','))
    .ToArray();

我希望将所有文件的内容保存在某种相当于 C++ std::map<string, std::map<int, std::map<int, double>>> FileMap 的位置,我可以在其中搜索文件名,例如 car,然后能够从特定位置的特定文件,例如下面的 C++ 代码:

double GetVal(string std::filename, int row, int column)
{
   return FileMap[filename][row][column]
}

如何在 C# 中做到这一点?

编辑:.csv 文件之一的内容:

Index,Time,value,,Index,Time,value
1,0,20,,1,0,120
2,1,30,,2,1,90

【问题讨论】:

  • 只使用通用字典
  • 那我如何将string[][] m_Data = File 转换成字典呢?我也需要知道怎么填字典。
  • 如果您提供示例文件,我可以编写一些代码来演示。你基本上必须分组然后调用字典。使用 linq 相当简单
  • 对不起!添加了示例文件。它可以用几个手臂向右延伸,并在时间范围内加深,它可以向下延伸。

标签: c# csv


【解决方案1】:

你可以有一个这样的类,它有一个 _dictionary 字段的类型,你可以在下面的例子中看到,然后你从文件中提取数据,将它们存储在 NxM 字符串数组中,然后调用 PopulateDictionary 方法来将数据添加到 _dictionary 字段。您对每个文件重复此过程。 然后您可以调用方法从 _dictionary 字段中读取值。

class Program
{
    static Dictionary<string, Dictionary<int, Dictionary<int, double>>> _dictionary = 
                                new Dictionary<string, Dictionary<int, Dictionary<int, double>>>();


    static void PopulateDictionary(string filename, string[][] data)
    {
        _dictionary.Add(filename, new Dictionary<int, Dictionary<int, double>>());

        for (int i = 0; i < data.Length; i++)
        {
            _dictionary[filename].Add(i, new Dictionary<int, double>());

            for (int j = 0; j < data[i].Length; j++)
            {
                _dictionary[filename][i].Add(j, double.Parse(data[i][j]));
            }
        }
    }

    static double GetVal(string filename, int row, int column)
    {
        return _dictionary[filename][row][column];
    }

    static void Main(string[] args)
    {
        List<string> csvData1 = new List<string>() { "23, 5, 7", "40, 15" };
        List<string> csvData2 = new List<string>() { "40, 80, 112", "13", "20, 65, 9" };

        string[][] dataArr1 = csvData1.Select(x => x.Split(',')).ToArray();
        string[][] dataArr2 = csvData2.Select(x => x.Split(',')).ToArray();
        PopulateDictionary("f1", dataArr1);
        PopulateDictionary("f2", dataArr2);

        Console.WriteLine(GetVal("f1", 0, 0));
        Console.WriteLine(GetVal("f2", 1, 0));
        Console.WriteLine(GetVal("f2", 2, 2));

        Console.ReadKey();
    }
}

我包含了一个 Main 方法,用于模拟字典的创建,您可以轻松运行该方法来检查我的解决方案是否适合您的需求。这些列表代表您应该从 csv 文件中读取的行。字符串矩阵表示按行和列组织的数据,其中包含字符串表示中的双精度值。然后,我模拟将值添加到字典中,给出文件名(您应该使用从中提取数据的 csv 文件的名称)和表示行和列的矩阵。 最后,我读取了在第一个列表中第一行的第一列找到的第一个值,然后是第二个列表中第二行唯一列的单个元素,最后是最后一行的最后一列第二个列表。

【讨论】:

  • 问题是如何创建Dictionary&lt;string, Dictionary&lt;int, Dictionary&lt;int, double&gt;&gt;&gt; 你刚刚创建了外部字典,但还没有创建任何内部字典。
  • 你是对的,我已经添加了使用从 csv 获取的数据填充字典的方法。
  • 看起来不错,但我得到 "Error CS1503 Argument 1: cannot convert from 'string' to 'char'x.Split 中将“”编辑为“”。
  • 对于每个 csv 文件,您一次读取一个,然后应用逻辑移动矩阵中的数据,然后传递文件名和矩阵以填充字典。您已经实现了读取文件并将其数据移动到 string[][] 的逻辑。
  • 不客气。我很高兴我的解决方案很有用。
猜你喜欢
  • 2016-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-03
  • 2020-07-17
  • 2014-01-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多