我正在尝试将字典中的值输出到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);
}
}
}
当前输出如下:
我需要的样本输出如下:
字典键(字符串)将保存文件路径,值(列表)将保存如下内容:
已签名 sha1RSA md5RSA md5RSA
已签名 sha1RSA sha1RSA sha256RSA sha256RSA
请提出如何获得所需的输出。
答案 0 :(得分:2)
我输入的答案更长,但我看到了问题。
在此行
var values = String.Join(",", keyvaluepair.Value.Distinct().Select(x => x.ToString()).ToArray());
取出Distinct
。看起来每个字符串中的项目数量正确,但是如果列表包含多个空白条目,Distinct
将消除重复项。如果列表包含两个或三个空白条目,则需要全部。如果您删除重复的空白,则您的列将无法对齐。
此外,当您使用Distinct
时,不能保证物品会以任何特定顺序返回。在这种情况下,顺序非常重要,因此值最终会出现在右列中。
因此,在上面的示例中,即使第一行的第三列中有空白,第四列中的值也将在第三列中结束,并且空白将结束。
这可能会解决当前的问题。如果您希望有一定数量的值(它们需要与列匹配),建议不要使用List<string>
,因为List<string>
可以包含任意数量的值。
相反,请尝试以下操作:
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<string, WhateverThisIs>
作为起点。
然后输出行的部分看起来像这样:
var value = keyvaluepair.Value;
var values = String.Join(",", value.Signature, value.HashValueSha1, value.HashValueSha2,
value.HashValueMd5, value.Other);
(是的,占空值。)
如果要将空值或空值替换为“ N / A”,则需要一个单独的函数,例如
string ReplaceNullWithNa(string value)
{
return string.IsNullOrEmpty(value) ? "N/A" : value;
}