簡體   English   中英

從字典c#將數據輸出到CSV特定列

[英]Output data to CSV specific columns from Dictionary c#

我正在嘗試將字典中的值輸出到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);
        }
    }
}

當前輸出如下所示:

當前的CSV輸出以及上面的代碼

我需要的示例輸出如下:

CSV輸出

字典鍵(字符串)將保存文件路徑,而值(列表)將保存如下內容:

簽名的sha1RSA md5RSA md5RSA

簽名的sha1RSA sha1RSA sha256RSA sha256RSA

請建議如何獲得所需的輸出。

輸入的答案更長,但我看到了問題。

在這條線上

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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM