2016-05-15 65 views
1

一两年后,我变得非常熟练,使用ArcGIS中的数据模型来处理属性表。 ArcGIS使用Access类型的数据库,使用户可以添加,删除和修改字段。在ArcGIS接口中,我可以创建一个新列,然后使用Python使用称为“字段计算器”的东西在此列上运行脚本。例如,以下算法将“230 04th street”作为输入字符串并将其转换为“230 4th street”。它也做了一些适合该项目的替代品。Access中的复杂文本解析

def calc(f1,f2,f3): 
#where f1 is address number, f2 is address name and f3 is address suffix 
#Strip trailing and ending spaces from all fields 
    #Define list 
    remove_list = ['01ST', '02ND', '03RD', '04TH', '05TH', '06TH', '07TH', '08TH', '09TH'] 

    #Homogenize single digit address names 
    if f2 in remove_list: 
     f2 = f2.replace('0','') 
    else: 
     f2 = f2 

    f1 = str(f1).replace('.0','') 
    #strip leading and trailing spaces 
    f1 = f1.strip() 
    f2 = f2.strip() 
    f3 = f3.strip()  
    #adapt address number to string format 

    #Concatenate full address name 
    x = f1+' '+f2+' '+f3 
    #Return Full address name 
    return x 

我想在Access中具有类似的灵活性。在Access中最接近ArcGIS的“字段计算器”是“表达式生成器”。这个表达式生成器对于简单的修改是可以的,但对于更复杂的字符串解析算法使用起来很麻烦。 Access中的任何内容是否为单个字段提供了这种脚本?我们可以在表达式生成器中使用VBA或其他语言吗?也许只是SQL是解决方案?

+1

您的脚本片段在Visual Basic中完全可行。 VB是Access的脚本语言。您不要在表达式构建器中使用VB“内部”,相反,您可以使用VB中的表达式构建器。我们可以有解析算法的“更复杂的字符串”的例子吗? –

+2

@PaulOgilvie - 不是一个坚持者,但你的意思是Visual Basic for Applications。 VBA是MS Office的编码接口,而不是通用语言VB。 VB大师将适合这种用词不当。 – Parfait

回答

1

如果您拥有完整的UI .exe程序,用户定义的函数可以集成到MS Access中。简单的脚本模块中的对象的函数,并调用它无论是在VBA或SQL:

Public Function Calc(f1 As String, f2 As String, f3 As String) As String 
    ' where f1 is address number, f2 is address name and f3 is address suffix ' 
    Dim remove_list() As Variant 
    Dim r As Variant 
    Dim x As String 

    ' Define list ' 
    remove_list = Array("01ST", "02ND", "03RD", "04TH", "05TH", _ 
         "06TH", "07TH", "08TH", "09TH") 

    ' Homogenize single digit address names ' 
    For Each r In remove_list 
     If f2 Like "*r*" Then 
      f2 = Replace(f2, r, Right(r, 3)) 
     Else 
      f2 = f2 
     End If 
    Next r 

    f1 = Replace(f1, ".0", "") 
    ' strip leading and trailing spaces ' 
    f1 = Trim(f1) 
    f2 = Trim(f2) 
    f3 = Trim(f3) 

    ' Concatenate full address name ' 
    x = f1 & " " & f2 & " " & f3 

    ' Return Full address name ' 
    Calc = x 

End Function 

VBA

Public Sub CleanAddress() 
    Dim fullAddress As String 
    Dim db As Database, rst As Recordset 

    Set db = CurrentDb 
    Set rst = db.OpenRecordset("TableName") 

    If rst.RecordCount = 0 Then Exit Sub 

    Do While Not rst.EOF 

     fullAddress = Calc(rst!f1, rst!f2, rst!f3) 
     rst.MoveNext 

    Loop 

    rst.Close 
    Set rst = Nothing 
    Set db = Nothing 
End Sub 

SQL

SELECT t.*, Calc(t.f1, t.f2, t.f3) As fullAddress 
FROM TableName t 

而且由于功能不太复杂,你可以使用嵌套字符串函数处理所有SQL:

SQL

SELECT t.*, 
    Trim(t.f1, Replace(t.f1, '.0', '')) & 

    Replace(
     Replace(
      Replace(
       Replace(
        Replace(
         Replace(
          Replace(
           Replace(
            Replace(Trim(t.f2), '01ST', '1ST'), 
           '02ND', '2ND'), 
          '03RD', '3RD'), 
         '04TH', '4TH'), 
        '05TH', '5TH'), 
       '06TH', '6TH'), 
      '07TH', '7TH'), 
     '08TH', '8TH'), 
    '09TH', '9TH') & 

    Trim(t.f3) As FullAddress 

FROM TableName As t 
1

...输入字符串,如 “230 04th街”,并将其转换为 “230第4 街”

这个例子可以在Access中实现与一个使用正则表达式的自定义VBA函数。

这里是这样的功能在Access立即窗口测试:

? Field_Calculator("230 04th street") 
230 4th street 

注意的图案将不匹配的文本片段如“34”“045th”,或“ 04abc“。因此,这些将是不变的功能:

? Field_Calculator("230 34th street") 
230 34th street 
? Field_Calculator("230 045th street") 
230 045th street 
? Field_Calculator("230 04abc street") 
230 04abc street 

这是功能,写入使用后期绑定:

Public Function Field_Calculator(ByVal pInput As String) As String 
    Const cstrPattern As String = "\b(0)(\d\w{2})\b" 
    Dim objRegExp As Object 
    Set objRegExp = CreateObject("VBScript.RegExp") 
    With objRegExp 
     .Pattern = cstrPattern 
     .IgnoreCase = True 
     Field_Calculator = .Replace(pInput, "$2") 
    End With 
End Function 

如果你喜欢早期绑定,设置为“微软的VBScript正则表达式参考“和做出这些改变:

'Dim objRegExp As Object 
'Set objRegExp = CreateObject("VBScript.RegExp") 
Dim objRegExp As RegExp 
Set objRegExp = New RegExp 

的功能,可以从另一个VBA程序被调用。它也可以在访问SQL从Access会话中运行时,可以使用:

UPDATE YourTable 
SET [street_address] = Field_Calculator([street_address]); 

但是它使用一个自定义的VBA函数不能从Access会话之外运行的查询。