【问题标题】:combine pipe delimited lines of text in multiple lines with vbscript?将多行中用管道分隔的文本行与vbscript结合起来?
【发布时间】:2021-04-14 18:36:14
【问题描述】:

我有一个输出的文本文件,基本上看起来像这样:

SMITHERSON, SMITH|00012345|15-Jan-1999|000885340
619649339|29-Sep-2015 00:09:30|Black|JOHNERSON, JOHN
00067890|02-Dec-1996|000490365|620094551
29-Sep-2015 23:06:01|Green|DAVISON, DAVE|00086543|06-Jun-2001|000938585
226438332|28-Sep-2015 00:12:12|Yellow

七条数据,它们的顺序总是正确的,但不幸的是它们一起运行并出现在不同的行上。每行末尾都有回车+换行符,并且没有管道分隔符。单个数据永远不会分成多行 - 我很难解释,所以这里有另一个例子:

DATA 1|DATA 2|DATA 3
DATA 4
DATA 5|DATA 6|DATA 7
DATA 1|DATA 2|DATA 3|DATA 4
DATA 5|DATA 6|DATA 7
etc...

它们之间会有空格,但每条数据将始终保持在自己的行上。

我正试图把它变成这样:

SMITHERSON, SMITH|00012345|15-Jan-1999|000885340|619649339|29-Sep-2015 00:09:30|Black
JOHNERSON, JOHN|00067890|02-Dec-1996|000490365|620094551|29-Sep-2015 23:06:01|Green
DAVISON, DAVE|00086543|06-Jun-2001|000938585|226438332|28-Sep-2015 00:12:12|Yellow

DATA 1|DATA 2|DATA 3|DATA 4|DATA 5|DATA 6|DATA 7
DATA 1|DATA 2|DATA 3|DATA 4|DATA 5|DATA 6|DATA 7
etc.

7 条数据,每条数据各占一行,但仍由 '|' 分隔让另一个软件正确读取。

我每天要花大约一小时手动更正文本文件,所以我一直在尝试找到一个可以用来做这件事的示例,但我没有任何运气来解决这个问题。

【问题讨论】:

    标签: vbscript


    【解决方案1】:

    这段代码没问题。我只测试了您的示例文本,而不是大文件。

    它将用分隔符替换换行符,然后将整个文件转换为一个大数组:

    Set fso = CreateObject("Scripting.FileSystemObject")
    Set input = fso.OpenTextFile("input.txt", 1)
    Set output = fso.OpenTextFile("output.txt", 2, True)
    
    Dim data: data = input.ReadAll
    input.Close()
    data = Replace(data, vbCrlf, "|")
    data = Split(data, "|")
    
    For i=0 To UBound(data) Step 7
       output.WriteLine data(i) & "|" & data(i+1) & "|" & data(i+2) & "|" & data(i+3) & "|" & data(i+4) & "|" & data(i+5) & "|" & data(i+6)
    Next
    
    output.Close()
    

    【讨论】:

    • 我从没想过会这样做,并且在第一次尝试 ST8Z6FR57ABE6A8RE9UF 时就成功了。我希望我在几个月前就问过这个问题,这样可以节省我生命中数周的手工编辑时间。还要感谢 BruceH。我知道你说它未经测试,不幸的是我遇到了一个错误,我怀疑我能否为自己解决问题,我可以看到你所写内容的逻辑,我很欣赏另一种看待它的方式。你们俩都受到我的尊重,再次感谢你们。
    【解决方案2】:

    未经测试,但这样的事情可能会做到这一点。 (本质上它将输入作为流复制到输出,但输入中的换行符被转换为管道字符,并且输出中的每七个管道被转换为换行符)

    Set fs = CreateObject("Scripting.FileSystemObject")
    Set f = fs.OpenTextFile("D:\data\thefile.txt", 1)
    Set o = fs.OpenTextFile("D:\data\combined.txt", 2, True)
    pipecount = 0
    Do While f.AtEndOfFile <> True
    
        If f.AtEndOfLine = True Then
            c = f.Read(2) ' Skip the CR+LF
            c = "|"       ' and pretend we got a pipe character
        Else
            c = f.Read(1)
        End If
    
        If c = "|" Then
            pipecount = pipecount + 1
            If pipecount = 7 Then
                pipecount = 0
                o.WriteLine()
            Else
                o.Write("|")
            End If
        Else
            o.Write(c)
        End If
    
    End While
    o.Close()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-17
      • 1970-01-01
      • 2018-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-08
      • 1970-01-01
      相关资源
      最近更新 更多