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

Arrays 如何读取文本文件中所有行的第一个元素,然后在Powershell脚本中对其进行迭代?,arrays,powershell,collections,iteration,powershell-3.0,Arrays,Powershell,Collections,Iteration,Powershell 3.0,我是Powershell脚本和编程的新手。我需要做以下工作: 有一个文本文件,它有许多行,每行都有用逗号分隔的元素。现在,有些行总是以“BB”开头,可以有数百个“BB”行。当它的“BB”,我需要做一些改变等 我想迭代所有的行,如果它以“BB”开头,那么我会做一些事情。下面只是一个测试代码,因为我不知道在这里做什么。我如何才能以最有效的方式来实现这一点,从而使其速度更快、性能更低 头顶 更新:现在,问题是“BB”行的第一个实例(奇怪)中的日期没有得到更新。这是更新后的代码,我写了: 现在,我应

我是Powershell脚本和编程的新手。我需要做以下工作:

  • 有一个文本文件,它有许多行,每行都有用逗号分隔的元素。现在,有些行总是以“BB”开头,可以有数百个“BB”行。当它的“BB”,我需要做一些改变等
我想迭代所有的行,如果它以“BB”开头,那么我会做一些事情。下面只是一个测试代码,因为我不知道在这里做什么。我如何才能以最有效的方式来实现这一点,从而使其速度更快、性能更低 头顶

更新:现在,问题是“BB”行的第一个实例(奇怪)中的日期没有得到更新。这是更新后的代码,我写了:

现在,我应该在“Foreach”循环之后写出文件,因为它会一次又一次地写入文件。另外,何时使用管道字符(|)



使用split获取第一个“列”

  • 您不需要在文件中插入标题,
    Import Csv
    可以处理 这个
  • 您可以删除标题,请参阅注释掉的变体
  • 导出Csv
    对所有字段双引号可能是一个问题
  • 如有必要,也可进行处理

样本输出:

"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....." 

随着要求的改变,我发布了一个新的答案。
因为您想更改第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.....

如果文件是逗号分隔的,为什么不在必要时使用导入Csv插入虚拟头呢?Hi@LotPings,这就是问题所在。我无法在文本文件中插入假标题。月份格式说明符必须是大写的
(Get Date)。ToString(“yyMMdd”)
谢谢您的帮助!然而,只有第一个“BB”记录更新,但其他“实例”没有改变。我没有解决我的问题。可能变量“$Row”在文件中不包含thr记录。此外,如何根据换行符/eol在数组中插入行。如果($Filedata.Split(“,”[0]-eq“BB”),则找不到我的“BB”记录。不能使用包含整个数据的th变量。循环遍历行并拆分行,看看我的示例现在,另一个问题是,循环一次又一次地运行,我想将更新的输出文件保存在一个目录中。它能一次更新ex(“500”BB”记录,然后保存文件输出文件,一旦进入目录)文件C:\PS\outfile1.txtNow,另一个问题是,循环一次又一次地运行,我想将更新后的输出文件保存在一个目录中。它能更新ex(“500”BB”吗一次性记录,然后保存文件输出文件,一旦进入目录)输出文件C:\PS\outfile1.txt抱歉,我听不懂。脚本是否按照您的要求工作?如果是,考虑接受和/或投票。否则,如果要保存到另一个文件/路径,请为此创建一个var并使用它们。按原样-脚本将更改内存中
$FileData
变量中满足条件的所有行,直到您将其保存回任何位置。不,单行中有许多项,并且这些项会在其他文件中更改,因此我无法使用标题。感谢您的正确回答。它就像一个符咒!现在,所有的“BB”记录都更新了日期。
## 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....." 
## 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.....