Если в текстовом файле хранится информация, которую надо представить в виде нумерованного списка, можно открыть файл в текстовом редактор и вручную проставить номера строк. Если файл один, а строк в нём не много, то не составит труда сделать это вручную. В остальных случаях лучше автоматизировать процесс. Рассказываю как сделать это при помощи PowerShell.
Итак, стоит задача автоматически пронумеровать строки из текстового файла, пропуская пустые строки и строки содержающие только символы пробела, а результат с пронумерованными строками сохранить в файл.
Всё это сделает следующий код сценария на PowerShell.
$pathInputFile = 'Original.txt'
$pathOutputFile = 'Numbered.txt'
$lineNumber = 1
$content = Get-Content -Path $pathInputFile
for ($i=0; $i -lt $content.Length; $i++) {
if ($content[$i] -match '\S') {
$content[$i] = "$lineNumber. $($content[$i])"
$lineNumber++
}
}
Set-Content -Path $pathOutputFile -Value $content
В этом примере кода в переменных $pathInputFile
и $pathOutputFile
задаются пути к оригинальному текстовому файлу и к файлу с пронумерованными строками. При помощи командлета Get-Content
в переменную $content
считывается содержимое оригинального текстового файла, которое, затем перебирается в цикле for
. Каждая строка, хранящаяся в переменной $content
, проверяется с использованеми регулярного выражения. Если строка содержит символы, отличные от пробелов, к строке добавляется номер из переменной $lineNumber
, а значение переменной увеличиватся на 1
. После завершение выполнения цикла for
содержимое переменной $content
при помощи командлета Set-Content
сохраняется в текстовый файл по пути из переменной $pathInputFile
.
При необходимости можно не создавать новый текстовый файл, а сохранить содержимое с пронумерованными строками в исходный файл. Для этого в параметре -Path
командлета Set-Content
вместо переменной $pathOutputFile
следует использовать переменную $pathInputFile
.
Если задача повторяется регулярно, будет удобнее написать функцию на PowerShell, добавив в неё дополнительные возможности.
Function Add-LineNumbers {
[CmdletBinding()]
[OutputType([Object[]])]
param (
[Parameter(Mandatory=$True,
ValueFromPipeline=$True
)]
[Object[]]
$Value,
[Int]
$FirstLineNumber = 1,
[string]
$Delimeter = '. '
)
begin {
$lineNumber = $FirstLineNumber
}
process {
for ($i=0; $i -lt $Value.Length; $i++) {
if ($Value[$i] -match '\S') {
$Value[$i] = "$lineNumber$Delimeter$($Value[$i])"
$lineNumber++
}
}
return $Value
}
}
Приведённая функция, названная в примере Add-LineNumbers
, принимает три параметра:
-Value
- обязательный параметр, тип Object[]
- массив строк, которые подлежат нумерации;-FirstLineNumber
- необязательный параметр, тип Integer
- начальный номер для нумерации первой строки, по умолчанию равен 1
;-Delimeter
- необязательный параметр, тип string
- строка-разделитель, отделяющая номер строки от текста строки, по умолчанию имеет значение .
(точка и пробел).
Для использования функции в конвейре в коде используются блоки begin
и process
.
В остальном логика функции Add-LineNumbers
повторяет логику, рассмотренную в первом примере сценария PowerShell.
В следующих примерах показаны разные варианты вызова функции Add-LineNumbers
.
# Вызов функции Add-LineNumbers с выводом результата в консоль.
# В качестве разделителя используется символ закрывающей скобки и пробел.
Add-LineNumbers -Value (Get-Content -Path 'C:\Text.txt') -Delimeter ') '
# Вызов функции Add-LineNumbers с сохранение результата в переменную.
# Нумерация строк начинается со 100.
$numbered = Add-LineNumbers -Value (Get-Content -Path 'C:\Text.txt') -FirstLineNumber 100
# Вызов функции Add-LineNumbers с сохранение результата в указанный текстовый файл.
Set-Content -Path 'C:\Numbered.txt' -Value (Add-LineNumber -Value (Get-Content -Path 'C:\Text.txt'))
# Вызов функции Add-LineNumbers в конвейере.
# В результате выполнения оригинальное содержимое текстового файла перезаписывается.
Get-Content -Path 'C:\Text.txt' | Add-LineNumbers | Set-Content -Path 'C:\Text.txt'
Добавьте функцию Add-LineNumbers
в свой файл профиля PowerShell и используйте при необходимости.