如何在.NET中有效地检查字符串中是否存在一个单词(在单词列表中)?
我需要导入大约300万行数据。每行有一个地址,该地址分为以下字段:如何在.NET中有效地检查字符串中是否存在一个单词(在单词列表中)?,.net,.net,我需要导入大约300万行数据。每行有一个地址,该地址分为以下字段: 街道:如史密斯街1号或史密斯街2/4号或史密斯街1号 郊区:里士满 声明: 国家:iso代码 当我读取每一行时,我需要将其与我们自己的数据库进行匹配,该数据库具有相同的字段结构 问题是当我们有以下情况时: DB:1史密斯街档案:1史密斯街 DB:史密斯街1号。档案:史密斯街1号 我有一个所有街道缩写的列表,但我不知道如何检查这两种街道类型 我正在尝试这样做: var addressIndexFull = new Dict
- 街道:如史密斯街1号或史密斯街2/4号或史密斯街1号
- 郊区:里士满
- 声明:
- 国家:iso代码
- DB:1史密斯街档案:1史密斯街
- DB:史密斯街1号。档案:史密斯街1号
var addressIndexFull = new Dictionary<string, int>();
var addressIndexAbbrev = new Dictionary<string, int>();
File Rows:
- 1 smith st
- 2 smith street
DB
- 1 smith street | ID: 1234
Result:
AIF => "1 smith street" | 1234
AIA => "1 smith st" | 1234
注:.NET4.5&C#。也许我遗漏了什么 首先规范化读取地址-去掉前导尾随空格,去掉嵌入空格,规范化街道地址中的数字(无前导零,…),强制使用小写。确保它尽可能与DB匹配 尝试匹配数据库 将街道替换为st,然后重试 将街道替换为st.再试一次 将st替换为street,然后重试 这是正常的启发式匹配 示例代码
//replace street by st, try again
var tryagain = addr.Replace(" street"," st");
可能更好的方法是使用regex表查找内容。也许是这样的
var replaces = new List<Tuple<string,string>>{
Tuple.Create("\wst$", "street"),
Tuple.Create("\wstreet$", "st"),
Tuple.Create("\wroad$", "rd"),
};
警告:以上是粗略的代码,我肯定没有编译,谷歌c#regex让它100%正确也许我遗漏了什么 首先规范化读取地址-去掉前导尾随空格,去掉嵌入空格,规范化街道地址中的数字(无前导零,…),强制使用小写。确保它尽可能与DB匹配 尝试匹配数据库 将街道替换为st,然后重试 将街道替换为st.再试一次 将st替换为street,然后重试 这是正常的启发式匹配 示例代码
//replace street by st, try again
var tryagain = addr.Replace(" street"," st");
可能更好的方法是使用regex表查找内容。也许是这样的
var replaces = new List<Tuple<string,string>>{
Tuple.Create("\wst$", "street"),
Tuple.Create("\wstreet$", "st"),
Tuple.Create("\wroad$", "rd"),
};
警告:以上是粗略的代码,我肯定不会编译,谷歌c#regex让它100%正确是的,我更多的是在代码示例之后,而不是更高层次的逻辑答案。你能详细说明一下怎么做吗:
用一些代码将street替换为st
?我害怕你会说:使用for循环<代码>对于每个缩写,字符串。替换。。当街道名称中有街道类型时,这不是很好。。。例如,Dark Alley Place
…match.Replace
不起作用。它将匹配整行(yay),这意味着:这个输入字符串与您给出的模式匹配。但是,替换将替换匹配的整个输入字符串:(是的,我更喜欢代码示例,而不是更高层次的逻辑答案。你能详细说明一下如何做:用一些代码替换street by st
?我担心你可能会说:使用for循环。对于每个abbriev,string.replace
。当街道名称中有street类型时,这并不太好……例如,深色a。)lley Place
…match.Replace
将不起作用。它将匹配整行(yay),这意味着:此输入字符串与您给定的模式匹配。但随后,Replace将替换匹配的整个输入字符串:(