2016-07-21 2 views
0

Я хочу захватить много текстового содержимого из файла .sql между комментарием --Start и --End.Подстрока получает слишком мало данных

Что бы я каким-то образом я Don `T получить метод подстроки правильно, чтобы захватить только текст в --start и --end комментарий:

text.sql

This text I want not 
--Start 
this text I want here 
--End 
This text I want not 

Этот это то, что я пробовал:

$insertStartComment = "--Start" 
$insertEndComment = "--End" 

$content = [IO.File]::ReadAllText("C:\temp\test.sql") 
$insertStartPosition = $content.IndexOf($insertStartComment) + $insertStartComment.Length 

$insertEndPosition = $content.IndexOf($insertEndComment) 
$content1 = $content.Substring($insertStartPosition, $content1.Length - $insertEndPosition) 
$content = $content1.Substring(0,$content1.Length - $insertEndPosition) 

было бы неплохо, если бы кто-то может помочь мне найти мою ошибку :-)

+0

Итак, в чем проблема? – vonPryz

+0

Проблема в том, что он получает слишком мало текста, и я не понимаю, почему. – HelloWorld

+0

Было бы неплохо, если бы вы отредактировали сообщение и добавили фактические результаты тоже. Когда я запускал образец, произошла ошибка в индексе подстроки. – vonPryz

ответ

0

Там же попытка использовать неинициализированный переменную в коде:

$content1 = $content.Substring($insertStartPosition, $content1.Length - $insertEndPosition) 

Переменная $content1 еще не инициализирован, таким образом, вызов подстрока идет наперекосяк. Когда вы снова запускаете код, переменная устанавливается - и результаты еще более странные.

Используйте Powershell's Set-StrictMode, чтобы включить предупреждения о неинициализированных переменных.

0

Это не подстрочный подход, который вы ищете, но я решил, что я выброшу решение RegEx. Это найдет текст между -Start и -End в текстовом файле. В этом случае я группирую согласованный текст с именованным захватом, который называется LineYouWant, и отображает совпадения, которые он находит. Это также работает, если у вас есть несколько экземпляров блоков --Start-End в одном файле.

$Text = [IO.File]::ReadAllText("C:\users\proxb\desktop\SQL.txt") 
[regex]::Matches($Text,'.*--Start\s+(?<LineYouWant>.*)\s+--End.*') | ForEach { 
    $_.Groups['LineYouWant'].Value 
} 
Смежные вопросы