我有一个系统,每天生成3个文本(.txt)文件,每个文件中有1000个条目。
生成文本文件后,我们运行一个vbscript(下面),通过在特定列位置输入数据来修改文件。
我现在需要这个vbscript来执行一个额外的任务,即将一个文本文件中的列分开。
例如,TR201501554s.txt文件如下所示:
6876786786 GFS8978976 I
6786786767 DDF78676 I
4343245443 SBSSK67676 I
8393372263 SBSSK56565 I
6545434347 DDF7878333 I
6757650000 SBSSK453 I
通过分离列的附加任务,数据现在看起来像这样,列分隔在特定位置。
6876786786 GFS 8978976 I
6786786767 DDF 78676 I
4343245443 SBSSK 67676 I
8393372263 SBSSK 56565 I
6545434347 DDF 7878333 I
6757650000 SBSSK 453 I
我想也许我可以添加另一个" case"通过使用" regex"来实现这一目标。模式,因为模式将只有3家公司找到 (DDF,GFS和SBSSK)。
但在看了很多例子后,我不确定从哪里开始。
有人可以让我知道如何在我们的vbscript(下面)中完成这项额外任务吗?
Option Explicit
Const ForReading = 1
Const ForWriting = 2
Dim objFSO, pFolder, cFile, objWFSO, objFileInput, objFileOutput,strLine
Dim strInputPath, strOutputPath , sName, sExtension
Dim strSourceFileComplete, strTargetFileComplete, objSourceFile, objTargetFile
Dim iPos, rChar
Dim fileMatch
'folder paths
strInputPath = "C:\Scripts\Test"
strOutputPath = "C:\Scripts\Test"
'Create the filesystem object
Set objFSO = CreateObject("Scripting.FileSystemObject")
'Get a reference to the processing folder
Set pFolder = objFSO.GetFolder(strInputPath)
'loop through the folder and get the file names to be processed
For Each cFile In pFolder.Files
ProcessAFile cFile
Next
Sub ProcessAFile(objFile)
fileMatch = false
Select Case Left(objFile.Name,2)
Case "MV"
iPos = 257
rChar = "YES"
fileMatch = true
Case "CA"
iPos = 45
rChar = "OCCUPIED"
fileMatch = true
Case "TR"
iPos = 162
rChar = "EUR"
fileMatch = true
End Select
If fileMatch = true Then
Set objWFSO = CreateObject("Scripting.FileSystemObject")
Set objFileInput = objWFSO.OpenTextFile(objFile.Path, ForReading)
strSourceFileComplete = objFile.Path
sExtension = objWFSO.GetExtensionName(objFile.Name)
sName = Replace(objFile.Name, "." & sExtension, "")
strTargetFileComplete = strOutputPath & "\" & sName & "_mod." & sExtension
Set objFileOutput = objFSO.OpenTextFile(strTargetFileComplete, ForWriting, True)
Do While Not objFileInput.AtEndOfStream
strLine = objFileInput.ReadLine
If Len(strLine) >= iPos Then
objFileOutput.WriteLine(Left(strLine,iPos-1) & rChar)
End If
Loop
objFileInput.Close
objFileOutput.Close
Set objFileInput = Nothing
Set objFileOutput = Nothing
Set objSourceFile = objWFSO.GetFile(strSourceFileComplete)
objSourceFile.Delete
Set objSourceFile = Nothing
Set objTargetFile = objWFSO.GetFile(strTargetFileComplete)
objTargetFile.Move strSourceFileComplete
Set objTargetFile = Nothing
Set objWFSO = Nothing
End If
End Sub
答案 0 :(得分:0)
答案 1 :(得分:0)
您可以在输入处理循环中添加regular expression replacement。由于您要重新格式化列,我会使用replacement function进行重新格式化。在全局范围中定义正则表达式和函数:
...
Set pFolder = objFSO.GetFolder(strInputPath)
Set re = New RegExp
re.Pattern = " ([A-Z]+)(\d+)( +)"
Function ReFormatCol(m, g1, g2, g3, p, s)
ReFormatCol = Left(" " & Left(g1 & " ", 7) & g2 & g3, Len(m)+2)
End Function
'loop through the folder and get the file names to be processed
For Each cFile In pFolder.Files
...
并修改输入处理循环,如下所示:
...
Do While Not objFileInput.AtEndOfStream
strLine = re.Replace(objFileInput.ReadLine, GetRef("ReFormatCol"))
If Len(strLine) >= iPos Then
objFileOutput.WriteLine(Left(strLine,iPos-1) & rChar)
End If
Loop
...
请注意,您可能需要更改iPos
值,因为拆分和重新格式化列会使行的长度增加2个字符。
回调函数ReFormatCol
具有以下(必需)参数:
m
:正则表达式的匹配(用于确定匹配的长度)g1
,g2
,g3
:表达式中的三个组p
:源字符串中匹配的起始位置(但此处未使用)s
:源字符串(但此处未使用)该函数构造了来自3组的匹配替换:
Left(g1 & " ", 7)
向第一组添加4个空格(例如GFS
)并将其修剪为7个字符。这是基于第一组总长度为3-5个字符的假设。GFS
" " & ... & g2 & g3
以2个空格为前缀添加上述操作的结果,并附加其他2个组(8978976
&
)。 GFS 8978976
< / LI>
Left(..., Len(m)+2)
然后将结果字符串修剪为原始匹配的长度加2个字符(以考虑插入的额外2个空格以将新的第二列与前一个第二列分开,现在是第三列)。 br />→ GFS 8978976