【问题标题】:False positives and False Negatives with Instr function带有 Instr 函数的误报和误报
【发布时间】:2020-06-24 21:03:25
【问题描述】:

我正在尝试使用 InStr 在数组中查找值。但是,我得到了误报和误报。

即将有一个字符串匹配,即使字符串完全匹配,也不会报告匹配或不报告匹配。

它需要 Outlook。它将突出显示的电子邮件转换为放置在指定路径中的文本文件。然后,它通过将文本读入数组并搜索数组内容来搜索文本文件中的分隔符。但是,如前所述,即使子字符串在数组中,InStr 也会返回误报和误报。我尝试过二进制和文本比较方法以及各种比较字符串。

有什么想法吗?

注意:1) 在对 InStr 感到沮丧之后,我尝试使用 if then 语句将数组与分隔符字符串进行比较,这就是我的代码最后几行中显示的内容。 2)我已将分隔符设置为“xxxxx”,您可以在 objfile.write 命令集之后的行中看到它。 3)我尝试过使用instr函数同时使用文本和二进制比较模式

3) 终极目标: a) 从 Outlook 中提取突出显示的电子邮件并合并到一个文本文件中。 b)根据邮件文本对分隔的文本文件进行排序(如果分隔符之间的文本包含y,则放入数组y,如果x...等) c) 以我指定的顺序(例如 x、y、z)将数组打印到电子邮件中

这是因为电子邮件每天在不同的时间到达,但必须每天按相同的顺序组织最终的摘要电子邮件。

谢谢。

下面是我的代码:

Sub MergeTextFromSelectedEmailsIntoTextFile()
  Dim objFS As New Scripting.FileSystemObject, objFile As Scripting.TextStream
  Dim objItem As Object, strFile As String
  Dim wrapArray() As String

  If ActiveExplorer.Selection.Count = 0 Then Exit Sub

  strFile = InputBox("Please enter the full path and file name for the merged text:" _
    , "Enter File Name")

  Set objFile = objFS.CreateTextFile(strFile, False)

  If objFile Is Nothing Then
    MsgBox "Error creating file '" & strFile & "'.", vbOKOnly + vbExclamation _
      , "Invalid File"
    Exit Sub
  End If

  For Each objItem In ActiveExplorer.Selection

    objFile.Write vbCr
    objFile.Write (vbCr & Chr(10) & Chr(13) & ("xxxxx") & Chr(13) & Chr(13) & vbCr & vbLf)
    objFile.Write (vbCr & vbLf & objItem.Body)
    objFile.Write (vbCr & vbLf & Chr(13))
  Next
  objFile.Close

'Define variables for writing to array

Dim i As Integer
Set objFile = objFS.OpenTextFile(strFile, ForReading)
'write file contents to array
Do Until objFile.AtEndOfStream
ReDim Preserve wrapArray(i)
wrapArray(i) = objFile.ReadLine
i = i + 1
Loop
Dim xxxxx As String
xxxxx = xxxxx

'check each array index for contents
'note i have tried 
''if instr(0, wraparray(i), "xxxxx",0) then msgBox "FoundDelim at line " & i

For i = LBound(wrapArray()) To UBound(wrapArray())
    If wrapArray(i) = "xxxxx" Then MsgBox "FoundDelim! at line " & i
Next i

【问题讨论】:

  • 我是不是很笨? - 看不到此代码中使用的InStr
  • 另外xxxxx = xxxxxxxxxx = "xxxxx" 不同。您正在将变量设置为自身,因此它将为空。
  • 感谢您指出自我分配错误。然而,这只是我之前尝试比较字符串的实验的残余,并且它没有在损坏的 if-then 语句中使用。另外,我编辑了帖子以使我的总体目标更加清晰。
  • 只是一个疯狂的猜测:在调用 instr 函数时,您指定了“二进制比较”(0 作为 arg #4)。因此,您实际上将八位字节与字符进行比较,因此可能会成为不同编码下不同字符表示的牺牲品 - 例如文件内容的 utf-8 和字符串文字的 iso-8859-1 的组合可能会产生误报和误报。根据comment 2 of this post's answer,您可以通过包含仅限 unicode 的字符来强制使用 utf8。
  • 我已经完成了文本比较和二进制比较,但都没有工作。上面消息中的内容只是代码的当前版本。如果有人倾向于调整和测试各种解决方案并发布结果,我也会发布我想要的结果。

标签: arrays vba outlook full-text-search false-positive


【解决方案1】:

请注意,InStr 返回一个整数,因此将函数的结果作为布尔值进行测试会导致不一致的行为。试试这个:

If InStr(wrapArray(i),"xxxxx") > 0 Then
  MsgBox "FoundDelim! at line " & i
End If

【讨论】:

  • 谢谢,终于用下面这行代码解决了:For i = LBound(wrapArray()) To UBound (wraparray()) If InStr(1, wrapArray(i), "xxx", vbTextCompare) <> 0 Then MsgBox "FoundDelimiter at line " & i End If Next i
  • 太棒了!如果这回答了您的问题,您可以通过单击答案文本左侧的复选标记将其标记为答案。这可以通过为您提供更高的“接受答案”比率来帮助您处理未来的询问,一些用户在回答问题之前会检查该比率。
猜你喜欢
  • 1970-01-01
  • 2017-04-30
  • 2017-07-06
  • 1970-01-01
  • 1970-01-01
  • 2011-11-21
  • 2021-12-12
  • 2020-04-05
  • 1970-01-01
相关资源
最近更新 更多