我正在抓取一些网络数据并插入Access 2007。 使用.vbs脚本获取和插入数据。 事情很顺利,直到最近升级了报废计划。
每个文本记录中都有一个额外的空间。 似乎与编码有关。
修剪 - 功能对此无效。
尝试替换A(Circumflex)和xA0,没有结果。
现在做 - 左(mystring,len(mystring)-1)。
由于我将抓取数百万条记录,解决这个问题的最简单和正确的方法是什么?
此外,如何解决这个问题,因为Access中的现有数据现在将包含此类“受污染”的数据?使用UPDATE语句?如何检查最后一个字符是否为空格?
答案 0 :(得分:4)
Trim()
将删除尾随空格。因此,如果您的字符串值以类似于空格的内容结尾,但未被Trim()
删除,则它实际上可能不是空格字符。另一种可能性是一个空格,后面是一个看不见的角色。
无论哪种方式,了解最后一个角色究竟是什么都是有用的。
SELECT Asc(Right(your_string, 1)) AS ascii_value
FROM YourTable;
一旦你知道这个角色是什么,你就可以决定如何最好地摆脱它。
我不知道最好的方式对你来说是什么。从注释中出现的细节来看,麻烦的字符似乎是一个不间断的空格,ASCII 160.你想在字符串末尾出现该字符时丢弃该字符。也许您还想丢弃在该情况下在非破坏空间之前的任何常规空格字符。但是如果字符串中的其他位置存在不间断的空格,则需要保留它们。
此外,您似乎希望对存储在Access表中的现有数据以及使用VBScript抓取过程收集的新传入数据执行此操作。从VBScript,查询不能使用自定义VBA函数或Replace()
函数。所以我不知道在没有看到你的抓取代码的情况下对新数据说些什么。对于现有数据,您可以使用UPDATE
语句,类似于您在问题中建议的语句,该语句应该可以在VBScript中或在Access会话中使用。
UPDATE YourTable
SET your_string = Left(your_string, Len(your_string) -1)
WHERE Asc(Right(your_string, 1)) = 160;
如果您还想丢弃尾随不间断空格前面的任何空格,请合并Trim()
。
UPDATE YourTable
SET your_string = Trim(Left(your_string, Len(your_string) -1))
WHERE Asc(Right(your_string, 1)) = 160;
答案 1 :(得分:2)
以下Access VBA模块代码将为您提供一个名为myRTrim()
的函数,您可以在UPDATE查询中使用该函数来修复现有记录,例如
UPDATE [MyTable] SET [MyField] = myRTrim([MyField])
Option Compare Database
Option Explicit
Public Function myRTrim(source As Variant) As Variant
Dim newLength As Long
If IsNull(source) Then
myRTrim = Null
Else
newLength = Len(source)
Do While newLength > 0
If Not IsCharToTrim(Mid(source, newLength, 1)) Then
Exit Do
End If
newLength = newLength - 1
Loop
myRTrim = Left(source, newLength)
End If
End Function
Private Function IsCharToTrim(testChar As String) As Boolean
Select Case testChar
'' characters to trim - add to this list if required
Case " ", Chr(255), Chr(9), Chr(160)
IsCharToTrim = True
Case Else
IsCharToTrim = False
End Select
End Function
对于新的擦除,您可以为VBScript代码添加相同的功能。或者,您可以将VBScript代码带入Access,将其调整为VBA(如果需要),并在那里使用它。