【问题标题】:Output data to CSV specific columns from Dictionary c#将数据从字典 c# 输出到 CSV 特定列
【发布时间】:2018-12-06 22:37:28
【问题描述】:

我正在尝试将字典中的值输出到 CSV,并且能够做到这一点。但是面临需要输出到 csv 的特定列的问题。我需要将字典中的特定数据值输出到 csv 中的特定列。

Dictionary<string, List<string>> file = new Dictionary<string, List<string>>();

for (var i = 0; i < stringList.Count(); i++)
{
    string line = stringList[i];
    string path = line.Replace("\r\n", "");
    path = path.Replace(" ", "");
    path = path.TrimEnd(':');

    if (File.Exists(path))
    {
        file[path] = file.ContainsKey(path) ? file[path] : new List<string>();
        for (var j = i + 1; j < stringList.Count(); j++)
        {
            string line2 = stringList[j];
            string path2 = line2.Replace("\r\n", "");
            path2 = path2.Replace(" ", "");
            path2 = path2.TrimEnd(':');

            if (File.Exists(path2))
            {
                i = j - 1;
                break;
            }
            else
            {
                if (path2.Contains("Verified") | path2.Contains("Algorithm"))
                {
                    var strings = path2.Split(':');
                    var listValue = strings[1].Trim();
                    file[path].Add(listValue);
                }
            }
        }
    }
}                

using (var writer = new StreamWriter(outputdir + "\\output_" + 
        DateTime.Now.ToString("yyyy_MM_dd_HHmmss") + ".csv"))
{
    writer.WriteLine("FilePath,Signature,HashValueSHA1, HashValueSHA2, HashValueMD5, Other");
    foreach (var keyvaluepair in file)
    {
        if (!keyvaluepair.Value.Contains("Unsigned"))
        {
            var values = String.Join(",", keyvaluepair.Value.Distinct().Select(x => x.ToString()).ToArray());
            writer.WriteLine("{0},{1}", keyvaluepair.Key, values);
        }
    }
}

当前输出如下所示:

我需要的示例输出如下:

字典键(字符串)将保存文件路径,值(列表)将保存如下内容:

签名 沙1RSA md5RSA md5RSA

签名 沙1RSA 沙1RSA sha256RSA sha256RSA

请建议我如何获得所需的输出。

【问题讨论】:

  • 您能否更新您的问题以包括字典的定义(例如,它是Dictionary&lt;string,Dictionary&lt;string,string&gt;&gt;)以及其中的信息是如何组织的?
  • @JohnWu 嗨,约翰,我刚刚包含了我的附加代码
  • 如果可能的话,你能把stringList中的内容也贴出来吗?
  • @kamalpreet:请查找更新后的帖子
  • dictionaryfile 没有在任何地方声明,看起来这是重要的部分。

标签: c# csv


【解决方案1】:

我输入了更长的答案,但我发现了问题。

在这条线上

var values = String.Join(",", keyvaluepair.Value.Distinct().Select(x => x.ToString()).ToArray());

取出Distinct。看起来您在每个字符串中都有正确数量的项目,但如果列表包含多个空白条目Distinct 正在消除重复项。如果一个列表包含两个或三个空白条目,您需要所有这些条目。如果您删除重复的空白,您的列将不会对齐。

此外,当您使用Distinct 时,无法保证商品会以任何特定顺序返回。在这种情况下,顺序非常重要,因此值最终会出现在正确的列中。

因此,在上面的示例中,即使第一行的第三列中有空格,第四列的值也会出现在第三列中,而空格会出现在末尾。


这可能会解决眼前的问题。当您期望一定数量的值(它们需要与列匹配)时,我建议不要使用 List&lt;string&gt;,因为 List&lt;string&gt; 可以包含任意数量的值。

请尝试以下方法:

public class WhateverThisIs
{
    public string Signature { get; set; }
    public string HashValueSha1 { get; set; }
    public string HashValueSha2 { get; set; }
    public string HashValueMd5 { get; set; }
    public string Other { get; set; }
}

然后,作为起点,使用Dictionary&lt;string, WhateverThisIs&gt;

那么输出行的部分会更像这样:

var value = keyvaluepair.Value;
var values = String.Join(",", value.Signature, value.HashValueSha1, value.HashValueSha2,
    value.HashValueMd5, value.Other);

(是的,这说明了 null 值。)

如果你想用“N/A”替换空值或空值,那么你需要一个单独的函数,比如

string ReplaceNullWithNa(string value)
{
    return string.IsNullOrEmpty(value) ? "N/A" : value;
}

【讨论】:

  • 哇 Scott Hannen :-).. 非常感谢您的意见。我会尝试这种方法,希望这能解决我的问题。
  • 这解决了我的问题:-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多