如何在文本字段中每次出现特定格式后插入新行

时间:2017-04-27 09:39:49

标签: regex excel vba ms-access

我有一个可以从中输出电子表格的系统。然后,我将此输出的电子表格导入MS Access。在那里,我在将最终结果合并到SharePoint 2013链接列表之前运行一些基本的更新查询。

我输出的电子表格有一个不幸的长文字段,里面有一些评论,这些都很重要。在托管电子表格的系统上,这些注释格式很好。当它输出的电子表格时,该字段变成一个很长的,非常不正常的字符串,如下所示:

  

2017年1月1日09:00,姓氏姓氏。 : - 已回复要求提供更多信息。 2017年2月15日15:12,姓氏姓氏。 : - 需要更多信息来处理请求。 2017年2月9日17:09,姓氏姓氏。 : - 已提出要求。

我想要做的是运行查询(在MS Access或MS Excel中),该查询可以扫描此字段,检测## / ## / ###上#&#34:##:##的出现次数#,姓氏姓氏。 : - "然后在它们之前自动插入换行符,因此这个文本格式更整齐。它显然会跳过这种格式的第一次出现,否则它会在字段的开头输入一个新行。理想的最终结果是:

  

2017年1月1日09:00,姓氏姓氏。 : - 已回应请求   了解更多信息   2017年2月15日15:12,姓氏姓氏。 : - 需要更多信息来处理请求。
  2017年2月9日17:09,姓氏姓氏。 : - 已提出请求。

说实话,到目前为止我还没有尝试过很多,因为我真的不知道从哪里开始。我不知道这是否可以在没有正则表达式的情况下完成,或者在简单查询中与VBA代码相比。

我确实开始构建一个正则表达式,如下所示:

[0-9]{2}:[0-9]{2}\s[o][n]\s[0-9]{2}\/[0-9]{2}\/[0-9]{4}\,\s

但这看起来有点荒谬,我相当肯定我会以一种非常不必要的方式去做。从我在文本中看到的内容中,检测下一次出现##; ##:## on ## / ## / ####"应该够了。如果我在此之后采取新的行,那就足够了。

2 个答案:

答案 0 :(得分:0)

Excel使用LF进行换行,Access使用CRLF。

因此,运行简单的替换查询就足够了:

UPDATE myTable
SET LongTextField = Replace([LongTextField], Chr(10), Chr(13) & Chr(10))
WHERE <...>

您需要确保在新导入的记录上只运行一次,而不是在所有记录上重复运行。

答案 1 :(得分:0)

您有自己的RegExp模式,现在需要创建一个函数来附加带有额外分隔符的已找到项目。

看看这个功能。它需要你的长字符串,并使用你的模式找到你的日期戳,并附加你的分隔符。

理想情况下,我会每行运行两次,并在每列之后添加分隔符,因此您有一个类似的字符串,

datestamp; firstname lastname; comment

然后,您可以使用arr = vba.split(text, ";")将数据放入数组并将其用作

date-stamp = arr(0)
name       = arr(1)
comment    = arr(2)


Public Function FN_REGEX_REPLACE(iText As String, iPattern As String, iDelimiter As String) As String
    Dim objRegex As Object
    Dim allmatches As Variant

    Dim I As Long
   On Error GoTo FN_REGEX_REPLACE_Error

    Set objRegex = CreateObject("vbscript.regexp")
    With objRegex
        .Multiline = True
        .Global = True
        .IgnoreCase = True
        .Pattern = iPattern

        If .test(iText) Then
            Set allmatches = .Execute(iText)
            If allmatches.count > 0 Then
                For I = 1 To allmatches.count - 1 ' for i = 0 to count will start from first match
                    iText = VBA.Replace(iText, allmatches.item(I), iDelimiter & allmatches.item(I))
                Next I
            End If
        End If
    End With

    FN_REGEX_REPLACE = Trim(iText)

    Set objRegex = Nothing

   On Error GoTo 0
   Exit Function

FN_REGEX_REPLACE_Error:
    MsgBox Err.description
End Function

将上述功能用作

mPattern     = "[0-9]{2}:[0-9]{2}\s[o][n]\s[0-9]{2}\/[0-9]{2}\/[0-9]{4}\,"
replacedText = FN_REGEX_REPLACE(originalText,mPattern,vbnewline)