2016-05-15 66 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會話之外運行的查詢。