【问题标题】:VBA: How to remove non-printable characters from dataVBA:如何从数据中删除不可打印的字符
【发布时间】:2017-06-12 11:01:25
【问题描述】:

我需要以编程方式删除不可打印的字符,例如:

制表符 - char(9) 换行符 - char(10) 回车 - char(13) 数据链接转义 - char(16)

我启动了一个通用函数,该函数将从 ms 访问表单字段的 lost_focus 事件中调用。

我还没有弄清楚如何识别字符串何时包含不需要的字符。

    Function RemoveNonPrintableCharacters(ByVal TextData) As String

        Dim dirtyString As String
        Dim cleanString As String
        Dim iPosition As Integer

        If IsNull(TextData) Then
            Exit Function
        End If

        dirtyString = TextData
        cleanString = ""

        For iPosition = 1 To Len(dirtyString)
            Select Case Asc(Mid(dirtyString, iPosition, 1))
                Case 9    ' Char(9)
                Case 10   ' Char(10)
                Case 13   ' Char(13)
                Case 16   ' Char(16)
                Case Else ' Add character to clean field.
                    cleanString = cleanString & Mid(dirtyString, iPosition, 1)
            End Select
        Next

        RemoveNonPrintableCharacters = cleanString

    End Function

这是我在测试时一直在使用的 2 个字符串:

This line,    has       multiple,     tabs       that   need to be removed


This line, has multiple,     
line
breaks
that
need to be removed

This line,    has       multiple,     tabs       that   need to be removed
And
Also contains
multiple,     
line
breaks
that
need to be  removed

【问题讨论】:

  • “我还没有弄清楚如何识别字符串何时包含不需要的字符。”您是否只想识别“脏”字符串以避免浪费时间在函数中执行不必要的处理?
  • 我想在字符串被发送到数据库之前清理它。
  • 请考虑“识别字符串何时包含不需要的字符”的任何方式都将涉及逐个迭代字符,无论是由您直接完成还是由其他一些内置函数完成。您的目标是加快流程吗?
  • 我肯定想要快速处理,但我的主要目标是避免不需要的数据进入数据库。这些是有时使用复制和粘贴文本的 MS Access 表单;有时这些文本行包含制表符、换行符,它们可以进入数据库。我正在为每个允许粘贴的字段添加对事件 Lost_Focus 的函数调用。

标签: string vba replace ms-access-2007


【解决方案1】:
    Function RemoveNonPrintableCharacters(ByVal TextData) As String

    Dim dirtyString As String
    Dim cleanString As String
    Dim iPosition As Integer

    If IsNull(TextData) Then
        Exit Function
    End If

    dirtyString = TextData
    cleanString = ""

    For iPosition = 1 To Len(dirtyString)
        Select Case Asc(Mid(dirtyString, iPosition, 1))
            Case 9, 10, 13, 16
                cleanString = cleanString & " "
                Case Else
                cleanString = cleanString & Mid(dirtyString, iPosition, 1)
        End Select
    Next

    RemoveNonPrintableCharacters = cleanString

End Function

【讨论】:

  • 所有这些连接都将是 slooowww。要用空格替换不需要的字符,请使用 Mid$ 语句。或者转换为字节数组,扫描它,然后转换回来。
  • 是的,好点。该解决方案更符合他自己的解决方案,他确定了一种方法来捕获他想要替换但没有对它们做任何事情的字符。
  • 嗨,RyanL,我怎样才能检查像这样的行:“这一行,在需要删除的单词之间有多个空格”,以便每个单词之间只有一个空格?
  • 另外,如果您能向我展示一种更有效的方法来使用函数执行此操作,我会很欢迎。谢谢。
【解决方案2】:
A = Chr(09) & "Cat" & Chr(10) & vbcrlf

A = Replace(A, Chr(10))
A = Replace(A, Chr(13))
A = Replace(A, Chr(09))

Msgbox A

这是人们通常的做法。

您的代码创建了很多隐式变量。

【讨论】:

    【解决方案3】:

    '首先你需要找到一个角色

    YourStr = "Bla bla bla..."

    如果 instr(YourStr, chr(10)) > 0 那么

    NewStr = Replace(YourStr, Chr(10),"")
    

    如果结束

    【讨论】:

      【解决方案4】:

      我正在用空格字符 chr(32) 替换不可打印的字符,但您可以根据需要进行更改。

      Function RemoveNonPrintableCharacters(ByVal TextData) As String
      Dim sClean$
      
      sClean = Replace(TextData, Chr(9), Chr(32))
      sClean = Replace(sClean, Chr(10), Chr(32))
      sClean = Replace(sClean, Chr(13), Chr(32))
      sClean = Replace(sClean, Chr(16), Chr(32))
      
      RemoveNonPrintableCharacters = sClean
      
      End Function
      

      【讨论】:

        【解决方案5】:

        这仅用于从字符串的右侧删除非打印字符,并且不要用空格替换字符。

        Function fRemoveNonPrintableCharacters(ByVal TextData) As String
        Dim dirtyString As String
        Dim cleanString As String
        Dim iPosition As Integer
        
        If IsNull(TextData) Then
            Exit Function
        End If
        
        dirtyString = TextData
        cleanString = ""
        
        For iPosition = Len(dirtyString) To 1 Step -1
            Select Case Asc(Mid(dirtyString, iPosition, 1))
                Case 9, 10, 13, 16, 32, 160
                    cleanString = cleanString
                    Case Else
                    cleanString = Left(dirtyString, iPosition)
                    Exit For
        
            End Select
        Next
        
        fRemoveNonPrintableCharacters = cleanString
        
        End Function
        

        【讨论】:

          【解决方案6】:

          使用 Excel Clean 功能,这似乎要简单得多。以下也有效:

          myString = Worksheets("Sheet1").Range("A" & tRow).Value 
          myString = Application.WorksheetFunction.Clean(myString)
          

          您还可以使用其他普通和自制的 Excel 函数:

          myString = Application.WorksheetFunction.Trim(myString)
          

          仍然没有让 Substitute 函数以这种方式工作,但我正在努力。

          【讨论】:

            【解决方案7】:

            当我搜索要使用的快速功能时,这是 google 搜索结果中排名靠前的结果,我有一个很好的旧 google,但没有真正解决我的问题。

            主要问题是即使没有问题,所有这些函数都会触及原始字符串。这会减慢速度。

            我已经对其进行了重写,以便仅在错误字符时进行修改,还扩展到所有不可打印的字符和超出标准 ascii 的字符。

            Public Function Clean_NonPrintableCharacters(Str As String) As String
            
                'Removes non-printable characters from a string
            
                Dim cleanString As String
                Dim i As Integer
            
                cleanString = Str
            
                For i = Len(cleanString) To 1 Step -1
                    'Debug.Print Asc(Mid(Str, i, 1))
            
                    Select Case Asc(Mid(Str, i, 1))
                        Case 1 To 31, Is >= 127
                            'Bad stuff
                            'https://www.ionos.com/digitalguide/server/know-how/ascii-codes-overview-of-all-characters-on-the-ascii-table/
                            cleanString = Left(cleanString, i - 1) & Mid(cleanString, i + 1)
            
                        Case Else
                            'Keep
            
                    End Select
                Next i
            
                Clean_NonPrintableCharacters = cleanString
            
            End Function
            

            【讨论】:

            【解决方案8】:

            当出现 Unicode 字符时,应修改此处显示的代码。我的提议包含程序无法识别的字符:

            Public Function Clean_NonPrintableCharacters(Str As String) As String
            
                'Removes non-printable characters from a string
            
                Dim cleanString As String
                Dim i As Integer
            
                cleanString = Str
                
                For i = Len(cleanString) To 1 Step -1
            
                    If Chr(Asc(Mid(cleanString, i, 1))) <> Mid(cleanString, i, 1) Then
                    cleanString = Left(cleanString, i - 1) & Mid(cleanString, i + 1)
                    End If
                    
                Next i
            
                Clean_NonPrintableCharacters = WorksheetFunction.Clean(cleanString)
            
            End Function  
            

            【讨论】:

              【解决方案9】:

              可以通过RegEx解决(在工具中添加MS VBScript正则表达式-VBE中的引用):

              Function NormalString(text As String, Optional filler = vbNullString) As String
                  Dim re As New RegExp
                  With re
                      .Pattern = "([\x00-\x1F\xA0])"
                      .Global = True
                      text = .Replace(text, filler)
                  End With
                  NormalString = text
              End Function
              

              【讨论】:

                【解决方案10】:

                如果有特殊字符,则用空格替换

                If InStr(TextData, Chr(9)) > 0 Then TextData = Replace(TextData, Chr(9), Chr(32))
                If InStr(TextData, Chr(10)) > 0 Then TextData = Replace(TextData, Chr(10), Chr(32))
                If InStr(TextData, Chr(13)) > 0 Then TextData = Replace(TextData, Chr(13), Chr(32))
                If InStr(TextData, Chr(16)) > 0 Then TextData = Replace(TextData, Chr(16), Chr(32))
                

                【讨论】:

                  猜你喜欢
                  • 2012-11-15
                  • 2020-04-08
                  • 2020-03-18
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2012-06-16
                  • 2020-10-08
                  相关资源
                  最近更新 更多