我有一个可以从中输出电子表格的系统。然后,我将此输出的电子表格导入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 ## / ## / ####"应该够了。如果我在此之后采取新的行,那就足够了。
答案 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)