Используйте 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 за раз, но расширение меняется каждый день)
- получить сценарий для удаления любой строки, которая начинается с 5442, непосредственно перед строкой, которая начинается 6999
- сделать скрипт, чтобы полностью удалить те строки, которые начинаются с и 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
.
Это будет мой псевдо-алгоритм для решения этой проблемы:
(Я скорее научу вас своим мыслям о том, как я бы его решил, чем предоставлю сам код)
сделать файл, используемый в качестве параметра (так что он может быть гибким) или сделать папку "диспетчер очереди", которую эта программа проверяет на наличие нового содержимого при запуске, например "Входящие" для почты. Тогда вам также нужна"исходящая". Таким образом, вы можете обрабатывать файлы по мере их поступления, не зная, как они называются, и перемещать их к "исходящим" при обработке.
-
сделать простой файл "config" для этой программы тоже. Каждая строка может представлять собой "фильтр", а затем вы можете добавить действия к строкам, если это необходимо.
7999 удалить
6999 удалить
5442 удалить
как в [pattern] [action]
теперь после чтения конфигурации в массив "ключей", затем проверьте" Входящие " для файлов. Для каждого файла обработайте его с помощью набор ключей.
файл обработки " XXXXXXXXX.log " (или любое другое имя) Загрузите все строки, если их не слишком много или readline, чтобы захватить один (в зависимости от производительности и использования памяти)
для каждой строки возьмите первые 4 буквы из строки...
теперь нам понадобится строка для разбора:
sLine = left(readline(input filestream), 4)
поскольку нам нужны только первые 4 символа, чтобы решить, нужно ли нам его сохранить.
Если это " sLine" (строка) находится в нашем массиве фильтров/шаблонов, тогда у нас есть совпадение... сделайте то, что мы настроили (в вашей текущей настройке - удалить = игнорировать строку).
6а. Если игнорировать, то перейти к следующей строке в текстовом файле, goto #7
6b. Если нет совпадения в массиве шаблонов, то у нас есть линия для хранения. Запишите это в выходной поток.
Если больше строк, далее (goto #5)
закрыть вход и выход файл.
удалить / переместить входной файл из папки "Входящие" (возможно, в резервную копию?)
Если больше файлов в каталоге [входящие], затем проанализируйте далее... идите на #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