2014-12-16 3 views
1

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

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

Например, ниже. Строка 1 и строка 2 содержат 80 символов с 8-значным числовым номером в конце. Так просто удалите последние 8 цифр, то есть 00100001 и 00100002. Для строк 3 и строки 4 ничего не делайте. Для строки 5 снова удалите последние 8 числовых цифр, то есть 00100024. Для строки 6 ничего не делайте. Постскриптум Материал в скобках (длина 80 строк 1) предназначен только для иллюстрации и не является частью любой линии.

ABCD some text  00100001 (length 80 Line 1) 
EFGH     00100002 (Length 80 Line 2) 
ABCD Some text    (Length less than 80 Line 3) 
XYZD       (Length less than 80 Line 4) 
MNOP     00100024 (Length 80 Line 5) 
ABCD       (Length less than 80 Line 6) 

Результат выше

ABCD some text  
EFGH     
ABCD Some text  
XYZD     
MNOP     
ABCD     

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

** 
#ERROR REPORTING ALL 
Set-StrictMode -Version latest 
$path  = "d:\users\desktop\D2d_Try" 
$files = Get-Childitem $path -Recurse | Where-Object { !($_.psiscontainer) } 

    Function getStringMatch 
    { 
     # Loop through all *.txt files in the $path directory 
     Foreach ($file In $files) 
     { 
     $content = Get-Content $file.fullName 

    $content | foreach-object { if($_.length -eq 80) { if($_ -match "^.{72}([0-9]{8})") 
    { 
    $_ -replace "$matches[1]"," " | out-file "c:\$file" -append 
    } 
    } 
    } 

    } 
    } 

    getStringMatch 

ответ

2

Существует много способов приблизиться к этому. Одним из решений является:

#ERROR REPORTING ALL 
Set-StrictMode -Version latest 
$path = "d:\users\desktop\D2d_Try" 

#Creating function first. 
#A function should not depend on a variable outside the function ($files in this case) 
Function getStringMatch([System.IO.FileInfo]$File, $OutputPath) 
{ 
    Get-Content $File.fullName | ForEach-Object { 
     #The following replace regex will remove the numbers if they are there and the length is 80, if not it will return it as it was. 
     $_ -replace "^(.{72})([0-9]{8})$", '$1' 
    } | Set-Content -Path (Join-Path $OutputPath $File.Name) 
} 


$files = Get-Childitem $path -Recurse | Where-Object { !($_.psiscontainer) } | % { getStringMatch -File $_ -OutputPath "C:\" } 

Если вы хотите обрезать все линии, чтобы избавиться от дополнительных пробелов в начале и в конце концов, вам просто нужно изменить $_ -replace ... линию:

($_ -replace "^(.{72})([0-9]{8})$", '$1').Trim() 

Для честно говоря, я не понимаю, почему вам нужно соответствовать 80 символам, если это единственный сценарий, где есть 8-значный идентификатор. Вы можете просто заменить все идентификаторы 8digit в конце строки. Для того, чтобы попробовать его заменить $_ -replace ... линию в образце выше:

$_ -replace '[0-9]{8}$' 
1

я следующий, и это похоже на работу:

#ERROR REPORTING ALL 
Set-StrictMode -Version latest 
$path  = "d:\users\desktop\Cobol_D2d" 
$files = Get-Childitem $path -Recurse | Where-Object { !($_.psiscontainer) } 

Function getStringMatch 
{ 
    # Loop through all *.txt files in the $path directory 
    Foreach ($file In $files) 
    { 
    (Get-Content $file.fullName) -replace '[0-9]{8}$',' ' | set-content $file.fullname 

} 
} 

getStringMatch 
+0

Так, казалось бы вы использовали ответ Фрод Ф. в это что вы отметите это как ответ. – Matt

+0

Нет проблем Мэтт. Я отметил его как ответ. – Yogesh

Смежные вопросы