MS Access提取与表列表相比,从长文本字段提取多个匹配的文本字符串



问题:查询无法在长文本字段中发现的限制单词的所有。它正在从〜100个值的表列中获取受限制的单词。

示例数据

表:与长文本字段相交:crekeetext

froceetext字段的示例内容:将rutabaga,韭菜,胡萝卜和白菜添加到InstantPot®中。密封并在高压下煮4分钟。快速释放蒸汽。将牛s切成薄片,然后将其转移到服务盘中。将蔬菜放在肉周围,撒上欧芹,并在侧面配酸奶油,辣根和芥末酱。

所需结果:想要将croceeText字段与表:限制性台式中的此简短文本字段限制ITITEM中的每个值进行比较。

限制性限制性ITEM包含100个值。假设它包含6个练习:牛奶,烘烤,勺子,胡萝卜,芥末和蒸汽。

查询会以A single 记录的特殊顺序找到这些匹配的单词:胡萝卜芥末steam

我已经尝试了以下操作:如何在Microsoft Access

中找到备忘录字段中的单词

结果:在长文本字段中找到许多匹配项的1 。

所需的结果:查找所有在长文本字符串中提取的匹配单词。重复&通配符很好。案例敏感是不好的。

尝试了示例:

SELECT a.Adjectives, b.Content
FROM A, B
WHERE b.Content Like "*" & a.[adjectives] & "*"

喜欢和之后,我相信这个问题是。我已经尝试使用%,括号,空间等。

我成为以下内容:

SELECT RecipeTable.RecipeText, RestrictedTable.RestrictedItem
FROM RecipeTable, RestrictedTable
WHERE RecipeTable.RecipeText LIKE  "*" & RestrictedTable.RestrictedItem & "*";

注意:

  1. 我可以找到很多建议可以找到单个单词,但不能将整个表列与一个字段进行比较。
  2. ,还有很多建议可以找到第一个子字符串或第n个位置,但是我希望所有匹配的子字符串。不是位置&恐怕使用修剪等会在搜索100个单词&的情况下放慢速度。修剪每个。
  3. 我很好,将其在我的表格上计算出的字段,该字段保存了creeteText字段。
  4. 也可以使用一个按钮来启动查询以将CookeText字段与限制性thecriptedItem列表进行比较的按钮&在同一表单上填写空字段限制性发现。

以下代码是找到备忘录中所有受限制单词的两种方法。尽管这一切都可以通过编程/工作表进行编程完成,但我建议使用临时或永久表通过VBA中的拆分函数从备忘录中提取单词(在考虑标点符号和其他数据擦洗后)。

将单词从备忘录字段分为数组后,然后可以将它们插入一个单独的表中,并带有外键参考对配方的参考。如果需要,这可能是临时表或永久性的,并且可能是工作流程的一部分。可以将像PendingReview之类的字段添加到处理中,以处理新记录,然后将其标记为False,以免再次处理它们。

在将单词添加到另一个表之后,它可以连接到配置通过外键,您应该有所有限制单词的匹配。

获得信息后,您可以存储统计数据并从临时表中丢弃工作记录或删除工作记录,直到该过程再次运行为止。

您可以在vba中使用有限单词的字典查找,即查询限制单词表,添加到字典中,然后通过与备忘录中的每个单词匹配较低的情况或案例不敏感的比较,但是它可能需要一段时间。

第一个代码段

如果要编译时间检查,则必须引用Microsoft脚本运行时我的路径是C: Windows syswow64 scrrun.dll.dll ))

Dim dic as Dictionary
Dim memoField as string
Dim words() as String
Dim matchCnt as Integer
'Other variables I didnt declare
'Code to populate dictionary
'Do Until rstRestricted.EOF
'  dic.add LCase$(rst("restrictedWord")), 0
'  rstRestricted.MoveNext
'Loop
'rstRestricted.Close
'Set rstRestricted = Nothing
Set rst = New adodb.Recordset
rst.Open "SELECT [MemoField] FROM RecipeTable;"
lngRowCnt = CLng(rst.RecordCount) - 1
For x = 0 to lngRowCnt
   memoField = LCase$(Nz(rst("MemoField")))
   'Replace punctuation like commas, periods
   'memoField = Replace(memoField, ",","")
   'Now split after data scrubbed
   words = Split(memoField, " ")
   intWordCnt = UBound(words)
   For z = 0 to intWordCnt
      If LenB(words(z)) <> 0 Then
          If dic.Exists(words(z) = True Then
              matchCnt = dic(words(z))
              dic(words(z)) = matchCnt + 1
          End If
      End If
   Next z
Next x
Dim WordKeys() as Variant
Dim y as Integer
Dim restrictedWord as string
Dim wordCnt as Integer
WordKeys = dic.Keys
For y = 0 to UBound(WordKeys) '-1
     restrictedWord = CStr(WordKeys(y))
     wordCnt = CInt(WordKeys(restrictedWord))
     'code to save or display stats
Next y
rst.Close
Set rst = Nothing
Set conn = Nothing

我只会将所有单词的分片分为一个用索引单词字段的工作表中,然后用限制单词计数进行汇总。

第二个代码段

'Option Explicit 
Dim sql as String
Dim memoDelimitedData() as String
'Other variables declared
'Code to open Recordset table for recipe and also code to open 
'Work table with adOpenDynamic (SELECT * from WorkTable)
'loop through records to be processed
'Split Field (May need variant instead of array.  My Access VBA is rusty)
 words = Split(memoField, " ")
 intWordCnt = UBound(words)
 For x = 0 to intWordCnt
    With rstWorkTable
      .AddNew
      !Word = words(x)
      !ForeignKeyIdToRecipeTable = intForeignKeyId
      .Update
    End With
 Next x 

然后,当您添加了工作表记录时,您可以加入contectable和限制性。

因此,从备忘录字段中构建一个可划界单词的工作表。将外国密钥引用到食谱表,然后加入限制性限制的限制性。

如果需要,这可能是对制作表或登台表永久表的查询。等。

这样,类似的东西就会为您提供匹配,其中有限表中的任何单词:

SELECT RecipeTable.RecipeText, RestrictedTable.RestrictedItem
FROM RecipeTable
  INNER JOIN WorkTable ON
   RecipeTable.Id = WorkTable.RecipeTableId
  INNER JOIN RestrictedTable ON
   WorkTable.ForeignKeyIdToRecipeTable = RestrictedTable.RestrictedItem

MS Access Split功能

那时您可以进行计数,总和和其他数据。

对不起,我以为我有示例代码,但找不到。我不得不在许多月前使用VBA和访问(单词计数/排名分配)做这样的事情,但我找不到。如今,我将使用具有数字表,XML/JSON功能或全文搜索功能的SQL Server进行此类操作。

希望,如果您需要限制MS Access内部的工作,这可能会帮助您指向正确的方向。

如果您不满意使用ADODB或DAO Recordes集,则可以构建带有外键的CSV划界文件,然后单词将文件导入工作表中。

最新更新