如何创建一个c#字典,它将读取.csv文件中的键和值

时间:2015-11-20 19:24:23

标签: c# csv dictionary visual-studio-2015

我有一个.csv文件,其中包含缩写列表及其实际含义,例如:

  

大笑,LOL

我需要能够在文本框中搜索缩写并将缩写替换为实际的单词。这是我到目前为止所理解的字典,但无法理解如何从文件中读取值。

 Dictionary<string, string> Abbreviations = new Dictionary<string, string>();
 Abbreviations.Add("Laughing Out Loud", "lol");
 foreach (KeyValuePair<string, string> abbrev in Abbreviations)
 {
     txtinput.Text = txtinput + "<<" + abbrev.Key + ">>";
 }

3 个答案:

答案 0 :(得分:0)

您可以先为您的文件创建一个Stream Reader,然后循环显示CSV中的所有值并将它们添加到字典中。

static void Main(string[] args)
{
    var csv_reader = new StreamReader(File.OpenRead(@"your_file_path"));

    //declare your dictionary somewhere outside the loop.

    while (!csv_reader.EndOfStream)
    {
       //read the line and split if you need to with .split('')
        var line = reader.ReadLine();           

       //Add to the dictionary here

    }

   //Call another method for your search and replace. 
   SearchAndReplace(your_input)
}

然后执行该方法,搜索输入是否存在于字典中以及是否确实替换它。

如果对您来说更容易,可以使用LINQ将csv的值放入字典中。

答案 1 :(得分:0)

您可以尝试使用此LINQ解决方案GroupBy来处理密钥在文件中多次的情况。

  Dictionary<string, string[]> result =
     File.ReadLines("test.csv")
    .Select(line => line.Split(','))
    .GroupBy(arr => arr[0])
    .ToDictionary(gr => gr.Key,
                  gr => gr.Select(s => s[1]).ToArray());

检查TextBox中是否存在Dictionary中的缩写:

foreach (KeyValuePair<string, string[]> abbrev in result)
{
    if (txtinput.Text == abbrev.Value)
    {
        txtinput.Text = txtinput + "<<" + abbrev.Key + ">>";
    }
}

答案 2 :(得分:0)

我将假设您的输入文件可能在实际文本中包含逗号,而不仅仅是将两个字段分开。

现在,如果是这种情况,那么用于格式化文件的标准CSV文件格式如下:

Laughing Out Loud,LOL
"I Came, I Saw, I Conquered",ICISIC

但是,根据您的示例,您在&#34; LOL&#34;之前有空格,因此您似乎没有使用标准CSV。

所以我将对此输入进行处理:

Laughing Out Loud, LOL
"I Came, I Saw, I Conquered",ICISIC
"to, too, or two", 2
because,B/C

对于此输入,此代码生成字典:

var dictionary =
(
    from line in File.ReadAllLines("FILE.CSV")
    let lastComma = line.LastIndexOf(',')
    let abbreviation = line.Substring(lastComma + 1).Trim()
    let actualRaw = line.Substring(0, lastComma).Trim()
    let actual = actualRaw.StartsWith("\"") && actualRaw.EndsWith("\"")
        ? actualRaw.Substring(1, actualRaw.Length - 2)
        : actualRaw
    select new { abbreviation, actual }
).ToDictionary(x => x.abbreviation, x => x.actual);

dictionary

你可以比这更好。很有可能创造一个超级功能&#34;这将为您一次性完成所有替换。

试试这个:

var translate =
(
    from line in File.ReadAllLines("FILE.CSV")
    let lastComma = line.LastIndexOf(',')
    let abbreviation = line.Substring(lastComma + 1).Trim()
    let actualRaw = line.Substring(0, lastComma).Trim()
    let actual = actualRaw.StartsWith("\"") && actualRaw.EndsWith("\"")
        ? actualRaw.Substring(1, actualRaw.Length - 2)
        : actualRaw
    select (Func<string, string>)(x => x.Replace(abbreviation, actual))
).Aggregate((f1, f2) => x => f2(f1(x)));

然后我可以这样做:

Console.WriteLine(translate("It was me 2 B/C ICISIC, LOL!"));

我得到了这个结果:

  

我也是,或者两个,因为我来了,我看见了,我征服了,大声笑出来!