拆分文本文件中的列

时间:2015-01-10 03:23:05

标签: regex vbscript

我有一个系统,每天生成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

2 个答案:

答案 0 :(得分:0)

首先使用正则表达式模式替换(\d+)\s+([A-Z]+)(\d+)\s+(\w+)替换为$1 $2 $3 $4

并按+拆分。好的。

Live demo

答案 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:正则表达式的匹配(用于确定匹配的长度)
  • g1g2g3:表达式中的三个组
  • 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