2011-12-14 2 views
2

VBScript를 사용하여 구분 된 텍스트 파일을 다시 포맷하거나 올바르게 포맷 할 수 있습니까? 최고의 제거 할 필요가 후행 공백을 포함VBScript는 구분 된 텍스트 파일을 올바르게/다시 포맷 하시겠습니까?

AGREE^NAME^ADD1^ADD2^ADD3^ADD4^PCODE^BAL^ARREARS 
00010004000051162^MISS JENNIFER GRAY      ^123 FAKE STREET   ^       ^TOWN      ^COUNTY ^POSTCODE ^004978.00^ 000188.72 

모든 데이터의 :

나는 다음과 같이 구분 ^있는 텍스트 파일이 있습니다. 이 작업을 수행하는 데 사용할 수있는 VBScript 만 있습니다.

ADO GetStrings를 사용하려고했지만 앞뒤 공백으로 인해 일관되지 않은 결과가 나타납니다.

누구든지 제안이나 대안을 제공 할 수 있습니까?

감사

ADO 텍스트 파일로 작업 할 때, 당신은 생성하라있는 schema.ini 파일에 테이블 정의 로 시작해야
+0

@ Ekkehard.Horner - 환상적인 답변, 명확하고 간결. 고맙습니다. – Danny

답변

3

:

Dim sTDir : sTDir = goFS.GetAbsolutePathName("..\data") 
    Dim sTbl1 : sTbl1 = "agree.txt" 
    Dim sFSpec : sFSpec = goFS.BuildPath(sTDir, sTbl1) 
    Dim sTbl2 : sTbl2 = "agree2.txt" 
    WScript.Echo "src file with spaces:" 
    WScript.Echo goFS.OpenTextFile(sFSpec).ReadAll() 
    Dim oTDb : Set oTDb = CreateObject("ADODB.Connection") 
    Dim sCS : sCS  = Join(Array(_ 
    "Provider=Microsoft.Jet.OLEDB.4.0" _ 
    , "Data Source=" & sTDir _ 
    , "Extended Properties=" & Join(Array(_ 
     "text" _ 
    ), ";") _ 
), ";") 
    oTDB.Open sCS 
    WScript.Echo "trimmed automagically:" 
    WScript.Echo oTDb.Execute(Replace("SELECT * FROM [@T]", "@T", sTbl1)) _ 
    .GetString(adClipString, , "|", vbCrLf, "") 
:

[agree.txt] 
Format=Delimited(^) 
ColNameHeader=True 
DecimalSymbol=. 
CharacterSet=ANSI 
TextDelimiter=None 
Col1=AGREE CHAR 
Col2=NAME CHAR 
Col3=ADD1 CHAR 
Col4=ADD2 CHAR 
Col5=ADD3 CHAR 
Col6=ADD4 CHAR 
Col7=PCODE CHAR 
Col8=BAL  FLOAT 
Col9=ARREARS FLOAT 

그런 다음 당신은 당신의 데이터에 액세스 할 수 있습니다

출력 :

src file with spaces: 
AGREE^NAME^ADD1^ADD2^ADD3^ADD4^PCODE^BAL^ARREARS 
00010004000051162^MISS JENNIFER GRAY      ^123 FAKE STREET ^       ^TOWN      ^COUNTY ^POSTCODE ^004978.00^ 000188.72 

trimmed automagically: 
00010004000051162|MISS JENNIFER GRAY|123 FAKE STREET||TOWN|COUNTY|POSTCODE|4978|188,72 

오른쪽 도구 을 사용하면 위와 같은 공백에는 아무런 문제가 없습니다.

sFSpec = goFS.BuildPath(sTDir, sTbl2) 
    If goFS.FileExists(sFSpec) Then goFS.DeleteFile sFSpec 
    Dim sSQL : sSQL = Replace(Replace(_ 
     "SELECT * INTO [@T2] FROM [@T1]" _ 
    , "@T1", sTbl1), "@T2", sTbl2) 
    WScript.Echo "Copy statement" 
    WScript.Echo sSQL 
    oTDb.Execute sSQL 
    WScript.Echo "QED: no spurious whilespace" 
    WScript.Echo goFS.OpenTextFile(sFSpec).ReadAll() 

출력 추가, 깨끗한 사본을 얻으려면 :

Copy statement 
SELECT * INTO [agree2.txt] FROM [agree.txt] 
QED: no spurious whilespace 
"AGREE";"NAME";"ADD1";"ADD2";"ADD3";"ADD4";"PCODE";"BAL";"ARREARS" 
"00010004000051162";"MISS JENNIFER GRAY";"123 FAKE STREET";;"TOWN";"COUNTY";"POSTCODE";4978,00;188,72 

드라이버가있는 schema.ini에

[agree2.txt] 
ColNameHeader=True 
CharacterSet=1252 
Format=Delimited(;) 
Col1=AGREE Char Width 255 
Col2=NAME Char Width 255 
Col3=ADD1 Char Width 255 
Col4=ADD2 Char Width 255 
Col5=ADD3 Char Width 255 
Col6=ADD4 Char Width 255 
Col7=PCODE Char Width 255 
Col8=BAL Float 
Col9=ARREARS Float 

(독일어 로케일 기본값)를 추가합니다; 원래의 형식을 다시 만들

[agree2.txt] 
Format=Delimited(^) 
ColNameHeader=True 
DecimalSymbol=. 
CharacterSet=ANSI 
TextDelimiter=None 
Col1=AGREE CHAR 
... 

이 편집 :

QED: no spurious whilespace 
AGREE^NAME^ADD1^ADD2^ADD3^ADD4^PCODE^BAL^ARREARS 
00010004000051162^MISS JENNIFER GRAY^123 FAKE STREET^^TOWN^COUNTY^POSTCODE^4978.00^188.72 

을 당신이 straighforward 방법으로 더 복잡한 작업을 해결할 수있는보다 정교한 SQL 문을 사용 및/또는 테이블 정의를 강화함으로써.

P.

here,

Dim sSQL : sSQL = Replace(Replace(_ 
     "SELECT * INTO [@T2] FROM [@T1]" _ 
    , "@T1", sTbl1), "@T2", sTbl2) 

당신이 궁금합니다 경우 (@ T1과 @의 T2 있습니다 하지 ADO 명령 매개 변수를하며 통화는 ADO가 다음 수정 문을보고 전에 적용) (교체 중첩되어) .

+0

정말 대단합니다. – Fionnuala

+0

정확히 내가 원했던 것! – Danny