如何读取文本文件中所有行的第一个元素,然后在 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"。当它 "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.....
使用拆分得到第一个"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.....
我是 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.....
使用拆分得到第一个"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.....