2015-01-10 64 views
0

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

我想也许我可以添加其他“的情况下”有可能使用“正则表达式”模式来做到这一点,因为这个模式将只有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

我编辑了您的标题。请参阅:“[应该在其标题中包含”标签“](http://meta.stackexchange.com/questions/19190/)”,其中的共识是“不,他们不应该”。 –

+0

您发布的代码的确切问题是什么? –

回答

0

你可以添加一个regular expressionreplacement您输入处理循环。既然你想重新格式化列,我会用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        
  • Left(..., Len(m)+2)然后修剪结果字符串到原来的匹配的长度加上2个字符(以考虑附加的2位插入到新的第二列从前者第二分开,现在第三,列)。
      GFS    8978976      
+0

感谢您的回复。你分享,工作,但还没有。我需要了解该功能的工作原理。你能告诉我ReformatCol = Left(“.....什么代码在做什么? – Andrea

+0

@Andrea查看更新的答案,更多详细信息请参阅我引用的文档 –

+0

非常感谢你。 – Andrea

0

在第一替代由正则表达式模式(\d+)\s+([A-Z]+)(\d+)\s+(\w+)$1 $2 $3 $4

替换和分裂,通过+。然后好的。

Live demo