2016-08-11 7 views
0

Итак, у меня есть 2 файла, которые имеют один и тот же стиль содержимого списка - Font ID, Font Def и Timestamp. Я хочу взять второй файл с новыми шрифтами и заменить строки первого файла с соответствующими идентификаторами шрифтов --- с помощью powershell (без базы данных, которая была бы намного проще).Замена строк текстового файла с помощью powershell, основанных на строках другого текстового файла

File2 text line = [FontIDA01] 5,5,5,5, randomtext, 11/10/2001 должен заменить линию File1, где [FontIDA01] соответствует, и заменить 5,5,5,5 с 6,6,6,6 и датой с датой на этой линии.

$content = Get-Content $fileSelected #(path chosen by user) 
$masterContent = Get-Content $masterContentPath #(hardcoded path) 
foreach($line in content) 
{ 
    $fontID = $line.SubString($startFontID, $endFontID)#this just sets font id = 23jkK instead of [23jkK] 
    foreach($masterLine in $masterContent) 
    { 
     if ($masterLine.Contains($fontID)) 
     { 
     $masterContent -replace $masterLine, $line where-Object{$_.Name -contains $fontID} | Set-Content $masterContent -raw 
     } 
    } 
} 

Я даже близко?

ответ

1

собирать новые данные в словаре и использовать его для замены:

# get new data in a dictionary 
$newData = @{} 
Get-Content 2.txt | %{ 
    $parts = $_ -split ' ' 
    $newData[$parts[0]] = @{numbers=$parts[1]; date=$parts[3]} 
} 

#patch original data using the new data dictionary 
Get-Content 1.txt | %{ 
    $parts = $_ -split ' ' 
    $id = $parts[0] 
    $new = $newData[$id] 
    if ($new) { 
     $id, $new.numbers, $parts[2], $new.date -join ' ' 
    } else { 
     $_ 
    } 
} | Out-File 3.txt -Encoding utf8 

Этот код берет на себя поля разделяются пробелами, поэтому, если это не так, вы должны будете использовать другие методы извлечение таких частей, как Select-String или регулярное выражение: if ($_ -match '(.+?) ([\d,]+) and so on') { $id = $matches[0] }.

+0

Если у вас есть ответ, который является более новичком? Я не знаю, что делает ваш код –

+0

Собственно, это именно то, что я думал о вашем коде. Глупый я, полагая, что мой код не требует пояснений ... Хорошо, кто-то опубликует лучший ответ, надеюсь. Если это какая-то помощь, код обрабатывает каждый файл строки за строкой, используя '|' piping. – wOxxOm

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

  • Нет связанных вопросов^_^