我有一个.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 + ">>";
}
答案 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);
你可以比这更好。很有可能创造一个超级功能&#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!"));
我得到了这个结果:
我也是,或者两个,因为我来了,我看见了,我征服了,大声笑出来!