代码:

代码:

我有以下格式的地址列:

120 Lemon Street Columbus OH 92738 (Basketball Courts)

我需要将其分为:街道地址(120 Lemon Street)、城市(Columbus)、州(OH)、邮政编码(92738)和描述((Basketball Courts))

有什么办法吗?所有这些都在同一个州,所以这不是问题。它们位于不同的城市/城镇,邮政编码也不同。

如果你只知道如何做其中的一部分,请告诉我。任何帮助我都会感激不尽,谢谢!

答案1

User1282637,我在下面设置了一个示例供您查看。我仅将其作为起点,以便您能够得出自己的完整答案。

首先,我建立了两个列表。一个是所有州的缩写,另一个是所有可接受的街道后缀,我在这里找到了:

http://pe.usps.com/text/pub28/28apc_002.htm

在此处输入图片描述

我使用列出的公式简单地将列表转换为以大写字母开头,然后其余部分变为小写,就像您写的一样。

接下来只是查找适用的内容..

在此处输入图片描述

这部分可以用很多方法完成,但我决定用这种方法作为示例。它将在相应的行中列出一个数字,以找到与所用后缀匹配的行。

我使用括号将(篮球场)部分分隔开:

在此处输入图片描述

我显示剩余的内容是因为在您的情况下“篮球场”中的“球场”也是一个街道后缀:

在此处输入图片描述

接下来我需要找出街道后缀的字符串的长度,因此我使用以下命令:

在此处输入图片描述

和这个...

在此处输入图片描述

最后,这让我可以只显示街道:

在此处输入图片描述

现在我还没有完成城市和州,但按照这个想法,你可以实现这一点。此外,如果你想要一个更干净的选项,那么一定要更多地了解 VBA。我希望这至少能教给你一些如何做到这一点的想法。

答案2

User1282637 询问是否有办法完成这项任务,并请求任何帮助。问题不在于 Excel 机制,而在于如何处理数据中的歧义。解析邮政编码和描述很简单(除非您有 5 位和 9 位邮政编码的混合)。困难的问题在于将街道与城市分开,所以我将重点介绍这一点。这并不是要一步一步地介绍如何使用 Excel 公式来完成这项工作。它只是分享对问题的一些见解,并描述一种获得困难部分结果的方法。

问题在于不同字段之间没有分隔符。这对于剥离描述或邮政编码来说不是问题,因为它们很容易识别。问题在于确定街道在哪里结束,城市在哪里开始。考虑街道部分的这些变化(远非详尽的列表):

120 Lemon Street
120 Lemon Drop Street
120 Lemon Street NW
120 East Lemon Street
120 Lemon Street Apt 3

街道中的“单词”数量可能从 1 或 2 个到 7 或 8 个不等,因此这对于解析来说没什么用。街道“类型”也不是特别有用。仅用于街道“类型”的单词就有大约 50-100 个(街道、大道、林荫大道、道路、收费公路、小巷、庭院、环形路、露台等)。再加上街道类型的缩写(包括正确和不正确的缩写),列表就有数百个。此外,这个名称并不总是街道字段中的最后一个单词。街道是最难识别的部分,因此合乎逻辑的方法是先识别其余部分,然后剩下的就是街道。

城市可以包含几个词。Washington Court House, OH 包含三个词。然后考虑像 St Marys, OH 这样的情况。“St”是城市名称的一部分还是街道类型名称;它属于哪个字段?或者 South Euclid, OH——“South”是城市名称的一部分还是街道地址的一部分?城市存在问题,但有办法解决它们。

即使使用邮政编码来识别城市也存在问题。城市名称和邮政编码之间并不总是 1:1 匹配。

解决这个问题最实用的方法是使用“字典”:城市列表和邮政编码目录。这些是地址中最明确的部分。这些可以在网上或邮政服务处找到。要进行比较,您可能需要清理数据或列表。它们需要相同的大写样式,数据中的任何多余空格都会阻止精确匹配。

如果您的数据或列表使用了缩写,则需要处理这个问题。当发现这些差异时,要么将未缩写的缩写翻译为标准缩写,要么根据缩写词典(也可以在线获取或从邮政服务处获取)进行二次匹配。

邮政编码很容易解析,这是一个很好的起点。根据邮政编码目录进行邮政编码查找。如果结果与邮政编码前面的一串单词完全匹配,则可确定记录的哪一部分是城市字段。

如果没有完全匹配或明确匹配,则转到城市名称比较。遍历城市名称列表。对于每个名称,确定其包含的单词数,并将其与邮政编码前面的单词数进行比较。

如果您通过任一过程获得匹配,则城市左侧的剩余内容就是街道地址。

使用数据库应用程序比使用电子表格更容易完成此类应用程序。无论哪种方式,您都会发现尝试以自动化方式执行此操作并非易事。您无法使用一些电子表格公式来完成此操作。

不管你的编程多么严谨,你仍然可能有一些记录需要手动解析,还有一些解析错误需要手动纠正。你没有指出你有多少条记录。手动操作可能会减少工作量。

如果数量很大,我不得不这么做,我会从列表中剔除。匹配简单的记录,例如明确的邮政编码匹配。然后让数据量决定你编写自动匹配程序的程度。

对于剩下的记录,假设您已经剥离了邮政编码和描述,这里有一种加速手动过程的方法。查看记录并直观地识别城市中的“单词”数量,这是一项快速的脑力任务。将其输入到规定的单元格中,并使用公式根据空格中断的数量将街道与城市分开(在第 N 个空格处分开,其中 N = 总空格数 + 1 - 城市名称中的单词数)。

答案3

试试这个。如果您可以接受将地址和城市放在同一个单元格中,这种简单的方法应该会非常有效。如果城市只有一个单词,我有一个公式可以提取城市,但如果城市包含多个单词(例如纽约),那么公式就会变得复杂得多。

公式... 地址和城市:=LEFT(A2,FIND("OH",A2)-1) 州:=MID(A2,FIND("OH",A2),2) - 您提到一切都是 OH,因此我保持简单 邮政编码:=MID(A2,FIND("OH",A2)+3,5) 描述:=TRIM(MID(A2,FIND("OH",A2)+8,30))

https://onedrive.live.com/redir?page=view&resid=D91C36B074F4D0F6!3224&authkey=!AO_MbW7Qxv4yWDo

在此处输入图片描述

答案4

代码:

Sub SplitAddress()
    Dim Addr As String
    Dim l As Integer
    Dim Desc As String
    Dim Zip As String
    Dim State As String
    Dim City As String
    
    Addr = Selection
    
    l = InStrRev(Addr, "(")
    Desc = Right(Addr, Len(Addr) - l + 1)
    
    Addr = Left(Addr, InStrRev(Addr, " ", l) - 1)
    
    l = InStrRev(Addr, " ")
    Zip = Right(Addr, Len(Addr) - l)
    
    Addr = Left(Addr, InStrRev(Addr, " ", l) - 1)
    
    l = InStrRev(Addr, " ")
    State = Right(Addr, Len(Addr) - l)
    
    Addr = Left(Addr, InStrRev(Addr, " ", l) - 1)
    
    l = InStrRev(Addr, " ")
    City = Right(Addr, Len(Addr) - l)
    
    Addr = Left(Addr, InStrRev(Addr, " ", l) - 1)
    
    Selection.Offset(0, 1) = Addr
    Selection.Offset(0, 2) = City
    Selection.Offset(0, 3) = State
    Selection.Range("B11").Offset(0, 4) = Zip
    Selection.Range("B11").Offset(0, 5) = Desc
End Sub

说明:按 并将Alt+F11上述代码粘贴到出现的窗口中。然后选择包含地址的单元格并返回到粘贴代码的窗口并按F5

如果可行,我们可以努力使其更加适合您的具体情况。

相关内容