【问题标题】:VBScript to correctly/re format a delimited text file?VBScript 正确/重新格式化分隔文本文件?
【发布时间】:2011-12-14 23:26:08
【问题描述】:

有人可以帮助我使用 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,但由于前导和尾随空格,它产生了不一致的结果。

谁能提供任何建议或替代方案?

谢谢

【问题讨论】:

  • @Ekkehard.Horner - 出色的答案,清晰简洁。非常感谢。

标签: text vbscript ado adodb


【解决方案1】:

使用 ADO 文本文件时,应从表定义开始 在适当的 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 语句和/或增强表定义,您可以直接解决更复杂的任务。

附言

here,如果

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

让你想知道(@T1 和@T2 不是 ADO 命令参数;嵌套的 Replace() 调用 apply before ADO 看到 then 修改的语句)。

【讨论】:

    猜你喜欢
    • 2023-03-19
    • 1970-01-01
    • 2010-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-10
    • 2012-03-07
    • 1970-01-01
    相关资源
    最近更新 更多