如何读取文本文件中所有行的第一个元素,然后在 Powershell 脚本中对其进行迭代?

How to read the first element of all Rows in a text file and then iterate over it in Powershell scripting?

我是 Powershell 脚本和编程的新手。我需要执行以下操作:

我想遍历所有行,如果它以 "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.....

使用拆分得到第一个"column"

$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)
    }
}
  • 文件中不需要插入Headers,Import-Csv即可处理 这个。
  • 您可以删除 headers,请参阅注释掉的变体。
  • Export-Csv 双引号所有字段可能是个问题。
  • 如果需要也可以处理。

## Q:\Test18\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....." 

随着要求的改变,我 post 一个新的答案。
因为您想更改第 5 个字段,所以我扩展了示例文件

## Q:\Test18\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.....