2015-01-10 3 views
0

매일 1000 개의 항목이 포함 된 3 개의 텍스트 (.txt) 파일을 생성하는 시스템이 있습니다.텍스트 파일의 열 분할

일단 텍스트 파일이 생성되면 특정 열 위치에 데이터를 입력하여 파일을 수정하는 vbscript (아래)를 실행합니다.

텍스트 파일 중 하나에서 열을 분리하는 추가 작업을 수행하려면이 vbscript가 필요합니다.

그래서 예를 들어 TR201501554s.txt 파일은 다음과 같다 :

6876786786 GFS8978976  I 
6786786767 DDF78676   I 
4343245443 SBSSK67676  I 
8393372263 SBSSK56565  I 
6545434347 DDF7878333  I 
6757650000 SBSSK453   I 

을 열을 현대 오토넷의 추가 작업으로, 데이터는 이제 특정 위치에 구분 열으로, 다음과 같이됩니다. 패턴이 (DDF, GFS 및 SBSSK를) 찾을 단지 3 회사가 될 것이기 때문

6876786786 GFS 8978976  I 
6786786767 DDF 78676  I 
4343245443 SBSSK 67676  I 
8393372263 SBSSK 56565  I 
6545434347 DDF 7878333  I 
6757650000 SBSSK 453   I 

하는 나는, 어쩌면 내가 아마 "정규식"패턴을 사용하여 이러한 목표를 달성하기 위해 다른 "경우"를 추가 할 수 있습니다 생각했다.

많은 예제를 살펴본 후에 어디서부터 시작해야할지 모르겠습니다.

다른 사람이 우리의 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 
...

와 같은 입력 처리 루프 수정 : 분할 이후 당신이 당신의 iPos 값을 변경해야 할 수도 있습니다

... 
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 
...

참고하고, 열의 서식을 다시 지정하면 줄 길이가 2 자 증가합니다.

  • m :

    콜백 함수 ReFormatCol 다음 (필수) 매개 변수가 정규 표현의 일치

  • g1, g2, g3 (일치의 길이를 결정하는 데 사용) 다음 표현식의 세 그룹
  • p : 소스 문자열에서 일치 항목의 시작 위치 (여기서는 사용되지 않음)
  • : 소스 문자열

함수는 다음과 같이 3 개 개의 그룹에서 일치 대체 구성한다 (그러나 여기에 사용)

  • Left(g1 & " ", 7)는 제 1 그룹에 4 개 공간을 추가 (예컨대 GFS) 7 자로 잘라냅니다. 이는 첫 번째 그룹이 항상 3-5 자 길이라는 가정을 기반으로합니다.
    GFS    
  • " " & ... & g2 & g3 2 개 공간과, 상기 연산 결과를 앞에 추가하고, 다른 두 그룹 (8978976 &         )를 추가한다.
      GFS    8978976        
  • Left(..., Len(m)+2) 다음 (지금 셋째, 이전 초에서 새로운 두 번째 열을 분리하는 삽입 부가 2 스페이스 열에 대한 계정)을 일본어 매치 기간 더하기 2 개 문자 결과 문자열 트림.
      GFS    8978976      
+0

답변 해 주셔서 감사합니다. 당신이 공유 한 것은 작동하지만 아직 없습니다. 함수가 어떻게 작동하는지 이해해야합니다. ReformatCol = Left ("..... 코드가 무엇을하고 있습니까? – Andrea

+0

@Andrea 업데이트 된 답변보기 자세한 내용은 내가 참조한 설명서를 참조하십시오. –

+0

감사합니다. – Andrea

0

$1 $2 $3 $4

교체 정규식 패턴 (\d+)\s+([A-Z]+)(\d+)\s+(\w+) 의해 대체 + 의한 분할. 그 다음 ok.

Live demo