我甚至不知道这个问题是属于这个问题还是属于另一个StackExchange网站,所以如果我是错误的话,请原谅。
我使用Excel对地址进行规范化,这样一旦完成,我就可以将它们插入到准备好的数据库中。
让我们快速获取一些地址(虚构):
1. 340 | 1st Street | MyCity
2. 2-648 | 2nd Avenue | AnotherCity
3. 102-648 | 2nd Avenue | MyCity
4. 8A-605 | Wilson Boulevard | MyCity
5. A45C-103¼ | Hunting Crescent | MyCity
我想用Excel公式实现的目标如下:
new Address() { StreetNumber=340, NumberSuffix=(NumberSuffixes)0, Street=streets.Single(s => s.Name == "1st Street"), City=cities.Single(c => c.Name == "MyCity") }
, new Address() { StreetNumber=648, NumberSuffix=(NumberSuffixes)0, UnitSuiteAppt="2", Street=streets.Single)s => s.Name == "2nd Avenue"), City=cities.Single(c => c.Name == "AnotherCity") }
, new Address() { StreetNumber=648, NumberSuffix=(NumberSuffixes)0, UniteSuiteAppt="102", Street=streets.Single(s => s.Name == "2nd Avenue"), City=cities.Single(c => c.Name == "MyCity") }
, new Address() { StreetNumber=605, NumberSuffix=(NumberSuffixes)0, UnitSuiteAppt="8A", Street=streets.Single(s => s.Name == "Wilson Boulevard"), City=cities.Single(c => c.Name == "MyCity") }
, new Address() { StreetNumber=103, NumberSuffix=(NumberSuffixes)1, UnitSuiteAppt="A45C", Street=streets.Single(s => s.Name == "Hunting Crescent"), City=cities.Single(c => c.Name == "MyCity") }
到目前为止,我的实际Excel公式如下所示:
=CONCATENATE("new Address() { StreetNumber=", RIGHT($D499, LEN($D499)-SEARCH("-",$D499)), ", NumberSuffix=(NumberSuffixes)0, UnitSuiteAppt=""", LEFT($D499, LEN($D499)-SEARCH("-",$D499)-2), """, Street = streetsOfShawinigan.Single(s => s.Name == """, $E499, """), City = cities.Single(c => c.Name == ""Shawinigan"") }")
我面临的问题是公式的这一部分:
[...]UnitSuiteAppt=""", LEFT($D499, LEN($D499)-SEARCH("-",$D499)-2), """[...]
似乎SEARCH()从一行到另一行的工作方式不同,因为它对于给定的行无法正常工作,而对另一行则无法正常工作。例如,它可以返回:
for 2nd address: [...]UnitSuiteAppt="2-"[...]
for third address: [...]UnitSuiteAppt="1"[...]
for fourth address: [...]UnitSuiteAppt="8A"[...]
for fifth address: [...]UnitSuiteAppt="A45"[...]
这只是说我想让它在破折号字符之前的第一部分UnitSuiteAppt
字符串值,而后面的部分是强制性的StreetNumber
。第一部分,即该公寓所说的,长度可变。因此,我需要更改有时-2
的{{1}},有时更改-1
,这似乎取决于地址公寓部分的长度,这很有意义, 毕竟。我的观点是SEARCH()总是会返回" - "的索引,因此,它似乎总是无法正常工作,否则,我就没有#&#但是我完全理解它是如何工作的,我怀疑这是认真的。 ; - )
感谢任何帮助。
提前感谢您的宝贵时间!
修改
我希望包括完整的通用解决方案,Rachel帮助我找到了非常有用和精确的答案。所以,这是完整的公式。
-3
答案 0 :(得分:1)
要获取UnitSuiteAppt
,请使用:LEFT($D499,IFERROR(SEARCH("-",$D499),20)-1)
。
要获取StreeNumber
,请使用:MID($D499,IFERROR(SEARCH("-",$D499),20)+1,20)
。
注意:值20是默认值,即搜索值的最大长度。