VBScript, чтобы правильно / переформатировать текстовый файл с разделителями? - PullRequest
2 голосов
/ 15 декабря 2011

Может ли кто-нибудь помочь мне переформатировать / правильно отформатировать текстовый файл с разделителями с помощью 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, но он дал противоречивые результаты из-за пробелов в начале и в конце.

Может кто-нибудь предложить какие-либо предложения или альтернативы?

Спасибо

1 Ответ

3 голосов
/ 15 декабря 2011

При работе с текстовыми файлами ADO следует начинать с определений таблиц в файле appraiate schema.ini:

[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

Тогда вы можете получить доступ к вашим данным:

  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, "" )

Выход:

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

Драйвер добавит

[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

(по умолчанию в немецкой локали) к schema.ini; отредактируйте это

[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

Используя более сложные операторы SQL и / или улучшая определения таблиц, вы можете решать более сложные задачи простым способом.

приписка

Смотрите здесь , если

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

заставляет задуматься (@ T1 и @ T2 не параметры команды ADO; вложенные вызовы Replace () применяются до того, как ADO увидит измененный тогда оператор).

...