В Powershell, как заменить строку на основе идентификатора записи в плоском файле - PullRequest
0 голосов
/ 11 января 2012

У меня в папке C: \ psa \ Prevalidation плоский файл с разделением запятыми с расширением .psa, например abc12.psa, category123.psa и т. Д. В файле есть разные типы записей. Дескриптор записи (первое поле) называется «product», «fixture», «position» и т. Д.

Что я хочу сделать, так это для каждой записи, начинающейся со слова «fixture», если 78-е поле пустое, заполните это поле строкой «Universal».

Я пытался сделать то же самое, когда он не зависит от позиции, но не знаю (1) как мне передать параметр позиции, запрашивая скрипт, чтобы проверять, только если 78-е поле пустое или нет (2), когда первое поле - «fixture» (3) Поскольку я конвертирую файлы в файл temp.csv, я хочу переименовать их обратно в их имена originam, но не уверен, как это сделать.

foreach($file in (dir C:\psa\Prevalidation\*.psa)){
Copy-Item $file.fullname C:\psa\Prevalidation\temp1.csv
Get-Content C:\psa\Prevalidation\temp1.csv | ForEach-Object { $_.replace("","Universal") } 

Любая помощь по этому вопросу высоко ценится. Спасибо, Сандерс.

1 Ответ

0 голосов
/ 11 января 2012

Если я правильно понимаю ваш вопрос, вы пытаетесь превратить что-то вроде этого:

Descriptor,Field2,Field3,Field4
product,Data2,,Data4
fixture,Data2,,Data4

В это:

"Descriptor","Field2","Field3","Field4"
"product","Data2","","Data4"
"fixture","Data2","Universal","Data4"

Вот код, который сделает это.

$csv = Import-Csv abc12.psa -Delimiter ','
# 77 is 78th field (starting from 0)
$fieldName = ($csv[0] | gm | ? {$_.MemberType -eq "NoteProperty"})[77].Name
$csv | % {
    if ($_.Descriptor -eq 'fixture' -and -not $_.$fieldName ) {
        $_.$fieldName = "Universal"
    }
}

$csv | ConvertTo-Csv -NoTypeInformation | Out-File C:\output.csv

Вот версия, которая не зависит от индекса поля:

$csv = Import-Csv abc12.psa -Delimiter ','
$fieldNames = ($csv[0] | gm | ? {$_.MemberType -eq "NoteProperty"}) | Select -ExpandProperty Name
$csv | % {
    if ($_.Descriptor -eq 'fixture') {
        foreach ($fieldName in $fieldNames) {
            if (-not $_.$fieldName) {
                $_.$fieldName = "Universal"
            }
        }
    }
}

$csv | ConvertTo-Csv -NoTypeInformation | Out-File C:\output.csv
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...