2016-12-14 94 views
0

我已经在泰国的餐馆网站上扫描了一些数据。我目前在地址栏中存在问题,因为在网站上当地址移到下一行时,刮板决定合并它并且不留任何空间。例如:Excel:解析地址

22/F, Dusit Thani Bangkok946 Rama 4 RoadBangkokThailand 
1/F, Oakwood Residence113 Thonglor Soi 13BangkokThailand 
G/F, Ocean Tower IISukhumvit Soi 21WattanaBangkokThailand 

在第一条目我希望第k和9以及d和B之间的空间,等等等等的其他条目。

我目前使用BeautifulSoup刮从here的数据。如果任何人都可以帮我解决这个问题,或者更好的方法来刮去HTML,那么我都会接受。我宁愿不要手动修改280多个地址条目。

+0

第一部分,从数字中分离出一个字母,不会太棘手。下一个问题是“道路”与“曼谷”的分离。它总是*会变成“曼谷”吗?或者,您是否有我们可以使用的城市列表?我正在考虑将每个单元格放在一个字母旁边的数字中,在两者之间添加空格。然后,我们只需要知道哪些城市要添加空间,哪些国家(只是“泰国”,所以不是那个问题的重点)。 – BruceWayne

+0

是的,我有一种感觉,那将是最难的部分。不幸的是,它还将其他城市放在那里,例如:Samutprakarn等。你会如何将这封信与数字分开? – dtrinh

回答

2

你的例子表明几种模式需要插入空格:

  • 小字母后跟一个大写字母
  • 小字母后跟数字
  • 数字,后面接着大写字母
    • (但是这最后可能有一个包含数字和字母的地址的问题)

这可以使用正则表达式在VBA中开发用户定义的函数来完成。


Option Explicit 
Function SplitAddress(S As String) As String 
    Dim RE As Object 
    Const sPatNumberCap As String = "\d(?=[A-Z])" 
    Const sPatNonCapNumberOrCap As String = "[a-z](?=[A-Z0-9])" 
    Const sRepl As String = "$& " 
    Dim sTemp As String 

Set RE = CreateObject("vbscript.regexp")  
With RE 
    .Global = True 
    .ignorecase = False 

    .Pattern = sPatNumberCap 
    sTemp = .Replace(S, sRepl) 

    .Pattern = sPatNonCapNumberOrCap 
    sTemp = .Replace(sTemp, sRepl) 
End With 

SplitAddress = sTemp 

End Function 

如果地址2A一些街道是一个问题,你也许能够改变.Pattern这取决于这些类型的字符串真正的样子。如果该空格是大写字母后面的非空白字符,则可以确保只插入该空格。

如:

Const sPatNumberCap As String = "\d(?=[A-Z]\S)" 

但没有例子,很难推测。

+1

谢谢你。这就像一个魅力。我真的需要刷上我的正则表达式。 – dtrinh