2016-02-04 5 views
0

Я получаю Thing с помощью этого кода.Как извлечь строки из строки

Const ForReading = 1, ForWriting = 2, ForAppending = 8 
Const TristateUseDefault = -2, TristateTrue = -1, TristateFalse = 0 
Dim fso, FileName, TextLine, Tempfile, inTempfile, strPath, Temp, intemp 
FileName = "C:\Users\rahul\Desktop\PLR\1.rtf" 
TempFile = "C:\Users\rahul\Desktop\PLR\Temp\1.txt" 
Set fso = CreateObject("Scripting.FileSystemObject") 
Set inFile = fso.OpenTextFile(FileName) 
Do While inFile.AtEndOfStream <> True 
    TextLine = inFile.ReadAll 
Loop 
Set regEx_ = new regExp 
With regEx_ 
    .Global = True 
    .MultiLine = True 
    .IgnoreCase = True 
    .Pattern = "\{\\\w{4}\\\w{4}\\\w{11}" 
TextLine = regEx_.replace(TextLine, "mmrk$&") 
'many such find and replace to get IMP lines Having mmrk 
End with 
set Temp = fso.CreateTextFile(TempFile, True) 
    Temp.Write TextLine 
    Temp.Close 
Set Temp = Nothing 

Set intemp = CreateObject("Scripting.FileSystemObject").OpenTextFile("C:\Users\rahul\Desktop\PLR\Temp\1.txt") 
Set outFile = CreateObject("Scripting.FileSystemObject").CreateTextFile("C:\Users\rahul\Desktop\PLR\Temp\11.txt",True) 

Do Until intemp.AtEndOfStream 
    Dim line : line = intemp.Readline 
    If Left(line, 4) = "mmrk" then outFile.writeLine(line) 
Loop 

intemp.Close 
outFile.Close 
inFile.Close 

Это работает нормально. У меня такое ощущение, что это неправильно. Как правильно сделать этот код.

Проблема заключается в том

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

Edit 2

Позвольте мне сузить проблему на этапе, когда я получаю ошибку.

Шаг 1. Откройте файл для чтения и получите текст как строку. Работа OK

Шаг 2. Несколько регулярных выражений Найдите и замените строку. Рабочий ОК

Шаг 3. Извлеките линии из строки, имеющей Left (line, 4) = "mmrk", чтобы получить желаемые строки в виде строки. Не работает

Шаг 4. Дальнейшие технологические линии, чтобы получить окончательную строку, содержащую нужные строки. - будут работать, если работает шаг 3. (Это фактически работает для гипотетического примера)

Шаг 5. Напишите строку в файл. Буду работать, если шаг 3 работы (работает на гипотетический пример

Как сделать из файла ответ here.

+0

См. Команду 'split'. Он может разбивать строку на массив строк, разбитых на любой символ, включая Chr (13). 'Фильтр' может создавать массив в строке поиска из другого. См. Справка VBS (https://www.microsoft.com/en-au/download/details.aspx?id=2764) –

ответ

0

Обычно, если у вас есть хотите извлечь определенные строки из входного файла, заменить что-то в них, и записать полученные (измененные) строки в выходной файл, вы бы просто сделать что-то вроде этого:

Set fso = CreateObject("Scripting.FileSystemObject") 

Set re = New RegExp 
re.IgnoreCase = True 
re.Pattern = "^\{\\\w{4}\\\w{4}\\\w{11}" 

Set inFile = fso.OpenTextFile("C:\path\to\input.txt") 
Set outFile = fso.CreateTextFile("C:\path\to\output.txt", True) 
Do Until inFile.AtEndOfStream 
    line = inFile.ReadLine 
    If re.Test(line) Then outFile.WriteLine re.Replace(line, "mmrk$&") 
Loop 
inFile.Close 
outFile.Close 

Если у вас есть несколько моделей, которые вы хотите предварять с «mmrk» вы будете использовать чередование (несколько шаблонов, разделенных символами трубы):

^pattern|pattern|pattern|... 

в ^ якорей выражение в начале строки/строки ,

+0

У меня проблема с неправильным объяснением вопроса. Это не точный ответ, который я хотел, но я думаю, что у меня есть идея от вас. Будет редактировать его так, как я хотел. – Rahul

+0

Я хочу найти в строке не файл. Можно ли читать строку как файл. Если это возможно с помощью vbscript, это решит мою проблему. Поиск этого. – Rahul

+0

@Rahul Я понятия не имею, что вы пытаетесь мне сказать. Возможно, вы захотите добавить пример к своему вопросу, показывающий ввод образца и то, что вы ожидаете от вывода (чтобы показать, что должно и что не должно быть в выходе). –

1

Вы используете readline и Instr().

Вашего кода для экстремальных задач.

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

Set Arg = WScript.Arguments 
set WshShell = createObject("Wscript.Shell") 
Set Inp = WScript.Stdin 
Set Outp = Wscript.Stdout 
    'Remove^from quoting command line. Quote, ampersand and brackets 
    Pttn = Replace(Arg(2), "^(", "(") 
    Pttn = Replace(Pttn, "^)", ")") 
    Pttn = Replace(Pttn, "^&", "&") 
    Pttn = Replace(Pttn, "^""", """") 
    Set regEx1 = New RegExp 
    If Instr(LCase(Arg(1)), "i") > 0 then 
     regEx1.IgnoreCase = True 
    Else 
     regEx1.IgnoreCase = False 
    End If 
    If Instr(LCase(Arg(1)), "v") > 0 then 
     IncExc = False 
    Else 
     IncExc = True 
    End If 
    regEx1.Global = False 
    regEx1.Pattern = Pttn 
    Do Until Inp.AtEndOfStream 
     Line=Inp.readline 
     If RegEx1.Test(Line) = IncExc then 
      outp.writeline Line 
     End If 
    Loop 

Фильтр считывает и записывает только стандартные и стандартные. Они доступны только в командной строке.

filter <inputfile >outputfile 
filter <inputfile | other_command 
other_command | filter >outputfile 
other_command | filter | other_command 

Фильтр

filter filter {[i][v]|n} expression 
filter filt {[i][v]|n} expression 

Фильтры строк в файле с помощью регулярного выражения. Он более гибкий, чем Windows 'Findstr.

Амперсанды и скобки в выражении должны быть экранированы с помощью каретки. Не избегайте ухода. Для котировок используйте шестнадцатеричный код \ x22.

ориентировочная цена

i - ignore case 
v - include non-matching lines 
n - none 

Expression

Regular Expression Reference

Пример

Чтобы извлечь все заголовки разделов, то есть линии без знака равенства

filter filter iv "=" < "%systemroot%\win.ini" 

Чтобы извлечь все заголовки разделов, начинающиеся с буквы нижнего регистра

filter filter n "\[[a-z].+" < "%systemroot%\win.ini" 

Это показывает каретку вытекающее открывающий кронштейн для CMD.EXE и обратной косой черты вытекающее открытия кронштейн для двигателя RegEx

фильтр Фильтр н "\^(" < "% SystemRoot% \ win.ini"

Это показывает, ища кавычка

filter filter n "\x22" < "%systemroot%\win.ini" 
+0

Я обязательно попробую это. Извините за то, что вы не поняли. Я отредактировал вопрос. Регулярно работает нормально. Я просто хочу найти строку с строкой. Это настоящая проблема. Возможно, мое понимание неверно. Я попробую описанное вами направление. – Rahul