Как прочитать первый элемент из всех строк в текстовом файле, а затем перебрать его в сценариях Powershell? - PullRequest
0 голосов
/ 30 апреля 2018

Я новичок в скриптинге и программировании Powershell. Мне нужно сделать следующее:

  • Существует текстовый файл с количеством строк, каждая строка имеет элементы, разделенные запятыми. Теперь некоторые строки всегда начинаются с «BB» и могут быть сотни строк «BB». Когда его "BB", мне нужно сделать некоторые изменения и т. Д.

Я хочу перебрать все строки, и если он начинается с "BB", я сделаю кое-что. Ниже приведен только тестовый код, так как я понятия не имею, что здесь делать. Как я могу сделать это наиболее эффективным способом, чтобы он был быстрым и имел меньшую производительность? накладные расходы.

Обновление: теперь проблема в том, что дата в первом экземпляре (странно) строки «BB» не обновляется. Это обновленный код, я написал:

Теперь я должен записать файл вне цикла «Foreach», поскольку он будет записывать в файл снова и снова. Также, когда использовать символ конвейера (|).

$path = 'C:\CE\InputFile\file_test1.txt'
$Filedata = Get-Content $path

$CurrentDate = (Get-Date).ToString("yymmdd")

foreach($Row in $Filedata){
if($Row.split(",")[0] -eq "BB")
{
    $Row2Date = $Row.Split(",")[4] 
    $Temp = $Filedata -replace $Row2Date, $CurrentDate | 

Out-File C:\outdata\outputfile1.txt

}

}

AA, field1, field2, field3, field4, field5.....
BB, field1, field2, field3, field4, field5.....
CC, field1, field2, field3, field4, field5.....
DD, field1, field2, field3, field4, field5.....
BB, field1, field2, field3, field4, field5.....

Ответы [ 3 ]

0 голосов
/ 30 апреля 2018
  • Вам не нужно вставлять заголовки в файл, Import-Csv может обработать это.
  • Вы можете удалить заголовки, см. Закомментированный вариант.
  • Возможно, проблема в том, что Export-Csv заключает в двойные кавычки все поля.
  • Это также может быть обработано, если необходимо.

## Q:\Test\2018\04\30\SO_50095738.ps1
$FilePath = '.\TestFile001.txt' 
$FileData = Import-Csv $FilePath -Header H0,H1,H2,H3
$test1 = 'test1'

ForEach($row in $FileData ) {
  If ($row.H0 -eq 'BB' ) {
    $row.H2 = $test1
  }
}
$FileData | Export-csv $FilePath -NoTypeInformation

## Variant with NoHeader
# $FileData|ConvertTo-Csv -NoTypeInfo|Select -Skip 1|Set-Content $FilePath

## Variant with no header and no quotes
# ($FileData|ConvertTo-Csv -NoTypeInfo).Replace('","',', ').Trim('"')|Select -Skip 1|Set-Content $FilePath

Get-Content $FilePath

Пример вывода:

"H0","H1","H2","H3"
"AA","field1","field 2","field 3....."
"BB","field1","test1","field 3....."
"CC","field1","field 2","field 3....."
"DD","field1","field 2","field 3....."
"BB","field1","test1","field 3....." 
0 голосов
/ 02 мая 2018

По мере изменения требований я публикую новый ответ.
Поскольку вы хотите изменить 5-е поле, я расширил образец файла

## Q:\Test\2018\04\30\SO_50095738_2.ps1
$FilePath1 = 'C:\CE\InputFile\file_test1.txt'
$FilePath2 = 'C:\outdata\outputfile1.txt'

$FileData1 = Get-Content $FilePath1
$CurrentDate = (Get-Date).ToString("yyMMdd")

$FileData2 = ForEach($Row in $Filedata1){
    If ($Row.split(",")[0] -eq "BB"){
       $Row  -replace ($Row.Split(",")[4]), $CurrentDate
    } else {
       $Row
    }
} 
Out-File -FilePath $FilePath2 -InputObject $FileData2

Пример вывода

AA, field1, field2, field3, field4, field5.....
BB, field1, field2, field3,180402, field5.....
CC, field1, field2, field3, field4, field5.....
DD, field1, field2, field3, field4, field5.....
BB, field1, field2, field3,180402, field5.....
0 голосов
/ 30 апреля 2018

Используйте разделение, чтобы получить первый "столбец"

$FileContent =Get-Content -Path "SomePath\test.txt"
foreach ($Row in $FileContent) {
    if ($Row.Split(",")[0] -eq "BB") {
        $NewRow = $Row -replace "BB", "XX"
        $FileContent = $FileContent.Replace($Row,$NewRow)
    }
}
...