Используйте vbscript для изменения текстового файла

каждый день мы получаем плоский текстовый файл. Несколько дней в файле есть строки, которые необходимо удалить, прежде чем его можно будет обработать. Эти линии могут появляться в разных местах, но всегда начинаются с символов 6999 или 7999. Мы хотели бы запустить скрипт, который будет удалять эти строки. Однако, и это далеко за пределами меня, где есть строка, которая начинается с 6999, будет строка непосредственно перед ней, которая начинается с 5442, которая также должна быть удалена, но только если она сразу появляется перед строкой 6999.

мы Магазин Windows и будет запускать этот скрипт как часть простого пакетного файла в Windows. Мы не используем Unix или Linux и не желаем этого.

расширение имени файла содержит дату. сегодняшняя файла.100621, завтра будет файл.100622. У меня проблемы с этим аспектом, так как кажется, что VBScript не любит файл.*

вот пример текстового файла:

4006006602    03334060000100580                                                 
40060066039    0334070000100580                                                 
700600000011571006210060001255863                                               
544264287250111000025000000000040008000801                                      
6999001000000000000000000000000000000000000000000000000000                      
6999001000000000000000000000000000000000000000000000000000                      
6999001000000000000000000000000000000000000000000000000000                      
799900000011571006210030000000000                                               
8007000000115710062102530054008920  

мы хотели бы удалить 5 строки в этом файле (строка 5442, три строки 6999 и строка 7999).

вот пример скрипта, который я нашел на этом сайте, изменил и имел некоторый успех, но не знаю, как удалить строки (только знаю, как заменить данные в строке). Я понимаю, что это либо потребует серьезных изменений, либо нужно будет вообще выбросить, но я публикую это, чтобы дать представление о том, что, я думаю, мы ищем. Я поместил это в каталог с cscript.exe и назвать его из простого пакетного файла:

Set objFS = CreateObject("Scripting.FileSystemObject")
strFile = "c:tempfile.100621"
Set objFile = objFS.OpenTextFile(strFile)
Do Until objFile.AtEndOfStream
    strLine = objFile.ReadLine
    If InStr(strLine,"6999")> 0 Then
        strLine = Replace(strLine,"6999","delete line")
    End If 
    WScript.Echo strLine
Loop

что получает меня это:

40060066039    0334070000100580                                                 
700600000011571006210060001255863                                               
544264287250111000025000000000040008000801                                      
delete line001000000000000000000000000000000000000000000000000000                      
delete line001000000000000000000000000000000000000000000000000000                      
delete line001000000000000000000000000000000000000000000000000000                      
799900000011571006210030000000000                                               
8007000000115710062102530054008920  

закрыть! просто нужно удалить строки вместо того, чтобы писать "удалить строку". Так вот мои конкретные потребности, основанные на том, что я знаю:

  1. получить скрипт для обработки любого файла в каталоге (и будет только 1 за раз, но расширение меняется каждый день)
  2. получить сценарий для удаления любой строки, которая начинается с 5442, непосредственно перед строкой, которая начинается 6999
  3. сделать скрипт, чтобы полностью удалить те строки, которые начинаются с и 6999 7999

4 ответов


я внес некоторые изменения, чтобы попытаться устранить пустую строку, я также добавил функцию для цикла через выходной файл и удалить любые пустые строки. Надеюсь, это сработает.

Select Case Wscript.Arguments.Count
    case 1:
        strInput = GetFile(WScript.Arguments(0))
        RemoveUnwantedLines strInput, strInput
        RemoveBlankLines strInput
    case 2:
        strInput = GetFile(WScript.Arguments(0))
        strOutput = Wscript.Arguments(1)
        RemoveUnwantedLines strInput, strOutput
        RemoveBlankLines strOutput
End Select

Function GetFile(strDirectory)
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    Set objFolder = objFSO.GetFolder(strDirectory)
    dateLastModified = Null
    strFile = ""
    For Each objFile in objFolder.Files
        If IsNull(dateLastModified) Then
            dateLastModified = objFile.DateLastModified
            strFile = objFile.Path
        ElseIf dateLastModified < objFile.DateLastModified Then
            dateLastModified = objFile.DateLastModified
            strFile = objFile.Path
        End If
    Next
    GetFile = strFile
End Function

Sub RemoveUnwantedLines(strInputFile, strOutputFile)
        'Open the file for reading.
    Set objFile = CreateObject("Scripting.FileSystemObject").OpenTextFile(strInputFile,1)
        'Read the entire file into memory.
    strFileText = objFile.ReadAll
        'Close the file.
    objFile.Close
        'Split the file at the new line character. *Use the Line Feed character (Char(10))
    arrFileText = Split(strFileText,Chr(10))
        'Open the file for writing.
    Set objFile = CreateObject("Scripting.FileSystemObject").OpenTextFile(strOutputFile,2,true)
        'Loop through the array of lines looking for lines to keep.
    For i = LBound(arrFileText) to UBound(arrFileText)
            'If the line is not blank process it.
        If arrFileText(i) <> "" Then
                'If the line starts "5442", see if the next line is "6999".
            If Left(arrFileText(i),4) = "5442" Then
                    'Make sure the next line exists (Don't want an out of bounds exception).
                If i + 1 <= UBound(arrFileText)Then
                        'If the next line is not "6999" 
                    If Left(arrFileText(i + 1), 4) <> "6999" Then
                            'Write the "5442" line to the file.
                        objFile.WriteLine(arrFileText(i))
                    End If
                Else
                        'If the next line does not exist, write the "5442" line to the file (without a new line).
                    objFile.WriteLine(arrFileText(i))
                End If              
                'If the line does not start with "6999" and the line does not start with "7999".
            Elseif Left(arrFileText(i),4) <> "6999"  AND Left(arrFileText(i),4) <> "7999" Then
                    'Write the line to the file.
                objFile.WriteLine(arrFileText(i))
            End If
        End If
    Next
        'Close the file.
    objFile.Close
    Set objFile = Nothing
End Sub

Sub RemoveBlankLines(strInputFile)
    Set objFile = CreateObject("Scripting.FileSystemObject").OpenTextFile(strInputFile,1)
        'Read the entire file into memory.
    strFileText = objFile.ReadAll
        'Close the file.
    objFile.Close
        'Split the file at the new line character.
    arrFileText = Split(strFileText,VbNewLine)
    Set objFile = CreateObject("Scripting.FileSystemObject").OpenTextFile(strInputFile,2,true)
        'Loop through the array of lines looking for lines to keep.
    For i = LBound(arrFileText) to UBound(arrFileText)
            'If the line is not blank.
        if arrFileText(i) <> "" Then
                'If there is another element.
            if i + 1 <= UBound(arrFileText) Then    
                    'If the next element is not blank.
                if arrFileText(i + 1) <> "" Then
                        'Write the line to the file.
                    objFile.WriteLine(arrFileText(i))
                Else
                        'Write the line to the file (Without a blank line).
                    objFile.Write(arrFileText(i))
                End If
            Else
                    'Write the line to the file (Without a blank line).
                objFile.Write(arrFileText(i))
            End If
        End If
    Next
    'Close the file.
    objFile.Close
    Set objFile = Nothing
End Sub 

использовать его вызывать ее из командной строки одним из двух способов.

RemoveUnwantedLines "C:\TestDirectory\" "C:\Output.txt"

или

RemoveUnwantedLines "C:\TestDirectory\"

Я думаю, что это сработает (но я не так хорош в VBS, поэтому никаких обещаний):

Set objFS = CreateObject("Scripting.FileSystemObject")
strFile = "c:\temp\file.100621"
Set objFile = objFS.OpenTextFile(strFile)
Dim cachedLine
Do Until objFile.AtEndOfStream
    strLine = objFile.ReadLine

    If Len(cachedLine) > 0 And InStr(strLine,"6999") = 1 Then
         WScript.Echo cachedLine        
    End If
    cachedLine = ""

    If InStr(strLine,"5442") = 1 Then
        cachedLine = strLine
    Else
        If InStr(strLine,"6999") = 1 Or InStr(strLine,"7999") = 1 Then
            ' do nothing
        Else
            WScript.Echo strLine        
        End If
    End If     
Loop

обратите внимание, что я думаю, что вы проверяли, содержат ли строки цифры в любом месте, но вы сказали, что правило, если они начинаются с чисел, вот почему я делаю <> 1, а не > 0.


Это будет мой псевдо-алгоритм для решения этой проблемы:

(Я скорее научу вас своим мыслям о том, как я бы его решил, чем предоставлю сам код)

  1. сделать файл, используемый в качестве параметра (так что он может быть гибким) или сделать папку "диспетчер очереди", которую эта программа проверяет на наличие нового содержимого при запуске, например "Входящие" для почты. Тогда вам также нужна"исходящая". Таким образом, вы можете обрабатывать файлы по мере их поступления, не зная, как они называются, и перемещать их к "исходящим" при обработке.

  2. сделать простой файл "config" для этой программы тоже. Каждая строка может представлять собой "фильтр", а затем вы можете добавить действия к строкам, если это необходимо.

    7999 удалить

    6999 удалить

    5442 удалить

    как в [pattern] [action]

  3. теперь после чтения конфигурации в массив "ключей", затем проверьте" Входящие " для файлов. Для каждого файла обработайте его с помощью набор ключей.

  4. файл обработки " XXXXXXXXX.log " (или любое другое имя) Загрузите все строки, если их не слишком много или readline, чтобы захватить один (в зависимости от производительности и использования памяти)

  5. для каждой строки возьмите первые 4 буквы из строки...

теперь нам понадобится строка для разбора:

sLine = left(readline(input filestream), 4) 

поскольку нам нужны только первые 4 символа, чтобы решить, нужно ли нам его сохранить.

Если это " sLine" (строка) находится в нашем массиве фильтров/шаблонов, тогда у нас есть совпадение... сделайте то, что мы настроили (в вашей текущей настройке - удалить = игнорировать строку).

6а. Если игнорировать, то перейти к следующей строке в текстовом файле, goto #7

6b. Если нет совпадения в массиве шаблонов, то у нас есть линия для хранения. Запишите это в выходной поток.

  1. Если больше строк, далее (goto #5)

  2. закрыть вход и выход файл.

  3. удалить / переместить входной файл из папки "Входящие" (возможно, в резервную копию?)

  4. Если больше файлов в каталоге [входящие], затем проанализируйте далее... идите на #4

Это не просто чистый VBSCRIPT, но идея алгоритма ann для любого языка...

Я надеюсь, что вы можете увидеть мою идею в нем, иначе вы просто прокомментируете ее, и я попытаюсь развить ее. Надеюсь, я дал вам отличный ответ.


OK, вот окончательный сценарий, как awesomely собранный Tester101. Этот скрипт удаляет строки, которые не нужны, как описано выше. Он также имеет дело с линиями, которые находятся в конце каждой строки (без моего ведома)

Select Case Wscript.Arguments.Count
case 1:
    strInput = GetFile(WScript.Arguments(0))
    RemoveUnwantedLines strInput, strInput
    RemoveBlankLines strInput
case 2:
    strInput = GetFile(WScript.Arguments(0))
    strOutput = Wscript.Arguments(1)
    RemoveUnwantedLines strInput, strOutput
    RemoveBlankLines strOutput
End Select

Function GetFile(strDirectory)
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFolder = objFSO.GetFolder(strDirectory)
dateLastModified = Null
strFile = ""
For Each objFile in objFolder.Files
    If IsNull(dateLastModified) Then
        dateLastModified = objFile.DateLastModified
        strFile = objFile.Path
    ElseIf dateLastModified < objFile.DateLastModified Then
        dateLastModified = objFile.DateLastModified
        strFile = objFile.Path
    End If
Next
GetFile = strFile
End Function

Sub RemoveUnwantedLines(strInputFile, strOutputFile)
    'Open the file for reading.
    Set objFile = CreateObject("Scripting.FileSystemObject").OpenTextFile(strInputFile,1)
    'Read the entire file into memory.
    strFileText = objFile.ReadAll
    'Close the file.
     objFile.Close
    'Split the file at the new line character. *Use the Line Feed character (Char(10))
    arrFileText = Split(strFileText,Chr(10))
    'Open the file for writing.
    Set objFile = CreateObject("Scripting.FileSystemObject").OpenTextFile(strOutputFile,2,true)
    'Loop through the array of lines looking for lines to keep.
    For i = LBound(arrFileText) to UBound(arrFileText)
        'If the line is not blank process it.
        If arrFileText(i) <> "" Then
            'If the line starts "5442", see if the next line is "6999".
            If Left(arrFileText(i),4) = "5442" Then
                'Make sure the next line exists (Don't want an out of bounds exception).
                If i + 1 <= UBound(arrFileText)Then
                    'If the next line is not "6999" 
                    If Left(arrFileText(i + 1), 4) <> "6999" Then
                        'Write the "5442" line to the file.
                        objFile.WriteLine(arrFileText(i))
                    End If
                Else
                    'If the next line does not exist, write the "5442" line to the file (without a new line).
                    objFile.WriteLine(arrFileText(i))
                End If              
            'If the line does not start with "6999" and the line does not start with "7999".
            Elseif Left(arrFileText(i),4) <> "6999"  AND Left(arrFileText(i),4) <> "7999" Then
                'Write the line to the file.
                objFile.WriteLine(arrFileText(i))
            End If
        End If
Next
    'Close the file.
objFile.Close
Set objFile = Nothing
End Sub

Sub RemoveBlankLines(strInputFile)
Set objFile = CreateObject("Scripting.FileSystemObject").OpenTextFile(strInputFile,1)
    'Read the entire file into memory.
strFileText = objFile.ReadAll
    'Close the file.
objFile.Close
    'Split the file at the new line character.
arrFileText = Split(strFileText,VbNewLine)
Set objFile = CreateObject("Scripting.FileSystemObject").OpenTextFile(strInputFile,2,true)
    'Loop through the array of lines looking for lines to keep.
For i = LBound(arrFileText) to UBound(arrFileText)
        'If the line is not blank.
    if arrFileText(i) <> "" Then
            'If there is another element.
        if i + 1 <= UBound(arrFileText) Then    
                'If the next element is not blank.
            if arrFileText(i + 1) <> "" Then
                    'Write the line to the file.
                objFile.WriteLine(arrFileText(i))
            Else
                    'Write the line to the file (Without a blank line).
                objFile.Write(arrFileText(i))
            End If
        Else
                'Write the line to the file (Without a blank line).
            objFile.Write(arrFileText(i))
        End If
    End If
Next
'Close the file.
objFile.Close
Set objFile = Nothing
End Sub