【问题标题】:Fill Dictionary(2) with keys to match Dictionary(1)用键填充字典(2)以匹配字典(1)
【发布时间】:2018-05-25 01:56:31
【问题描述】:

我确实找到了this link,但是我未能成功地将其从添加日期时间转换为添加空 int 键。


我有 2 个字典。我使用一个作为 csv 的“标题”行,第二个作为每个“数据”行。

想法是,不管信息的格式如何,我都可以查看相应单元格的标题的索引(键值),并将值放入适当的位置。

例如,文件 A 有一个“姓名”字段,而文件 B 有一个“年龄”字段。它扫描文件 A,并将0, "Name" 添加到 headerDictionary,然后扫描文件 B,并添加 1, "Age"。

这是我的问题开始的地方:

然后它会查找每个文件的值。它在文件 A 中找到“名称”的值,引用 headerDictionary 以检索密钥,并添加 0, "Bob"。然后可以将其写入 csv。它对文件 B 执行相同的过程,并添加 1, "23",以写入 csv。

我的问题是,如果我使用此信息填写 csv,我的 csv 仍将如下所示:

Name,Age
Bob
23

所以我需要填空,还要重新排序字典,以便正确填写每条记录。

// Add empty entries to recordDictionary, based on the headerDictionary

// recordDictionary for File A:
 [0, "Bob"]
 [1, ""]

// recordDictionary for File B:
 [0, ""]
 [1, "23"]

那么我的 csv 将如下所示:

Name,Age
Bob,
,23

【问题讨论】:

  • 最后一个文本框是您的预期输出吗?
  • 您是否有一个标题字典和多个记录字典(每个“文件”一个)?
  • @Monty 是的,是的。为每个新文件重新创建“记录”字典,以避免构建“矩阵”。
  • 那么对于每个“文件”,您需要遍历标题字典中的每个键:如果它不在记录字典中,只需输入一个逗号,如果是,则输出值和一个逗号。我在这里错过了什么吗?
  • @monty 是的。而已。我只想确保每个条目都位于适当的位置,因为 1 个文件可能同时具有两个“字段”,但顺序不同(即“年龄”、“姓名”)。解释我为什么要使用索引,这样我可以在必要时重新排序。

标签: c# .net csv dictionary


【解决方案1】:

[编辑 4:为未来的访问者回答标题问题]

//after you've filled your record dictionary from file...
foreach(int i in headers.Keys) {
    if (!singleRecord.ContainsKey(i)) {
        singleRecord.Add(i, "");
    }
}

[原创]

var headers = new SortedDictionary<int, string>();
//...populate headers dictionary
var singleRecord = new Dictionary<int, string>();
//...populate a record
var sb = new StringBuilder();

foreach(int i in headers.Keys) {
    sb.Append((singleRecord.ContainsKey(i) ? singleRecord[i] : "") + ",");
}

要么删除尾随逗号,要么只在需要时添加它。

[编辑 1] 虽然这回答了您的具体问题,但我认为将标题存储为列表会更容易,而您的 singleRecord 字典中的键将只是实际的标题字符串。

[编辑 2] 就个人而言,我建议简单地构建一个 DataTable。每当您点击文件中的新标题时,您都可以添加额外的列,并且只需添加一个空字符串作为默认值。然后我会使用一个 wee 函数将任何 DataTable 转换为 csv。

[编辑 3] 这是伪代码(来自问题的聊天讨论)

create new DataTable
for each folder
    for each file
        create new DataRow
        for each label
            if data.Columns not yet with name label
                create new column, default value ""
            add value to row
        add row to DataTable
output DataTable as csv file, or string. //(build yourself a Utility to do this... it's a pretty common thing to want to do)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-04
    • 1970-01-01
    • 2022-06-15
    相关资源
    最近更新 更多