Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   VBS. Прочитать определенные строки из файла (http://forum.oszone.net/showthread.php?t=307424)

alex1985khv 02-11-2015 08:56 2570635

VBS. Прочитать определенные строки из файла
 
Имеются файлы со следующим содержимым:

Acct Number & Extension 4437761038265905889 Merchant State/Prov. Code
Floor Limit Indicator Requested Payment Service
CRB/Exception File Ind Number of Payment Forms
PCAS Indicator Usage Code 1
Acquirer Reference Nbr 74647875158522522154444 Chargeback Reason Code 00
Acquirer's Business ID 00000000 Settlement Flag 8
Purchase Date 20150607 Auth Characteristics Ind N
Destination Amount 000000105423 Authorization Code
Destination Currency Code 643 POS Terminal Capability 9
Source Amount 000000105423 International Fee Ind
Source Currency Code 643 Cardholder ID Method 4
Merchant Name PAYPAL *ITRADEZONE Collection-Only Flag
Merchant City 35314369001 POS Entry Mode 01
Merchant Country Code RU Central Processing Date 20150608
Merchant Category Code 5732 Reimbursement Attribute 0
Merchant ZIP Code 00000

Нужно сделать так, чтобы выводилось из этого файла (в выходной файл output.txt выгружать) значения в строках Acct Number & Extension, Acquirer Reference Nbr и Source Amount.
На примере выше должно выглядеть как:
74647875158522522154444, 4437761038265905889, 000000105423
....
....(и т.д.)
Через точку с запятой или просто запятой перечислять. Весь файл содержит шаблоны как выше, только цифры разные. Пример ниже выводит только Acquirer Reference Nbr, а как прицепить в цикле два других значения, чтобы в одной строке были перечислены?


Const ForReading = 1
Dim strSearchString


Set objFSO = CreateObject("Scripting.FileSystemObject")
Set inFile = objFSO.OpenTextFile("C:\input.txt",ForReading)
Set outFile = objFSO.OpenTextFile("C:\output.txt",2,True)



Do While Not inFile.AtEndOfStream

strSearchString = inFile.ReadLine

If (Left(strSearchString,23) = " Acquirer Reference Nbr") then
outFile.Writeline Mid(strSearchString,28,23)
end if
Loop

inFile.Close
outFile.Close
WScript.Echo "Файл обработан"

Iska 02-11-2015 19:27 2570811

alex1985khv, упакуйте образец реального файла в архив, приложите к сообщению. Максимальный размер одного такого файла каков может быть?

alex1985khv 03-11-2015 02:12 2570915

Iska, на работе, к сожалению, не могу приложить. Блокирует политикой доступа. Вес может быть до 20 мегабайт.
Сам файл состоит как из примера выше - после строки Merchant ZIP Code 00000 следует пару пустых строк ниже и опять Acct Number & Extension...Только в цифрах различие, которые мне надо выгрузить в отдельный файл.
Т.е. отобрать все строки, названия которых начинаются только на:
Acct Number & Extension
Acquirer Reference Nbr
Source Amount
И из них цифры (выделены жирным шрифтом), длина которых всегда фиксирована.
Acquirer Reference Nbr 74647875158522522154444 Chargeback Reason Code 00
Acct Number & Extension 4437761038265905889 Merchant State/Prov. Code
Source Amount 000000105423 International Fee Ind

Iska 03-11-2015 03:16 2570918

Цитата:

Цитата alex1985khv
Сам файл состоит как из примера выше »

Сам файл может быть в произвольной кодировке. В случае юникода — с BOM или без. Могут быть разные концы строк.

Ну, попробуйте так:
Скрытый текст
Код:

Option Explicit

Dim strSourceFile
Dim strDestFile

Dim strContent
Dim strOutputContent

Dim objMatch


If WScript.Arguments.Count = 1 Then
        strSourceFile = WScript.Arguments.Item(0)
       
        With WScript.CreateObject("Scripting.FileSystemObject")
                If .FileExists(strSourceFile) Then
                        strDestFile = "output.txt"
                       
                        With .OpenTextFile(strSourceFile)
                                strContent = .ReadAll()
                                .Close
                        End With
                       
                        With WScript.CreateObject("VBScript.RegExp")
                                .IgnoreCase = True
                                .Global = True
                                .Multiline = True
                                .Pattern = _
                                        "^Acct Number & Extension (\d+) [\s\S]*?" & _
                                        "Acquirer Reference Nbr (\d+) [\s\S]*?" & _
                                        "Source Amount (\d+) .*$"
                               
                                If .Test(strContent) Then
                                        strOutputContent = ""
                                       
                                        For Each objMatch In .Execute(strContent)
                                                With objMatch.SubMatches
                                                        strOutputContent = strOutputContent & .Item(1) & "," & .Item(0) & "," & .Item(2) & vbCrLf
                                                End With
                                        Next
                                Else
                                        WScript.Echo "Can't find pattern [" & objRegExp.Pattern & "]."
                                        WScript.Quit 3
                                End If
                        End With
                       
                        With .CreateTextFile(strDestFile)
                                .Write strOutputContent
                                .Close
                        End With
                Else
                        WScript.Echo "Can't find source file [" & strSourceFile & "]."
                        WScript.Quit 2
                End If
        End With
Else
        WScript.Echo "Usage: cscript.exe //nologo """ & WScript.ScriptName & """ <Source file>"
        WScript.Quit 1
End If

WScript.Quit 0


Путь к исходному файлу указывается аргументом скрипта (также можно просто перетащить исходный файл на скрипт в Проводнике).


Время: 06:47.

Время: 06:47.
© OSzone.net 2001-