根据字符串

时间:2018-03-21 23:01:52

标签: powershell powershell-v4.0

我有一个非常大的文件(因此.ReadLines),我需要高效快速地解析并拆分成其他文件。对于包含关键字的每一行,我需要复制该行并附加到特定文件。这是我到目前为止,脚本运行,但文件没有填充。

$filename = "C:\dev\powershell\test1.csv"

foreach ($line in [System.IO.File]::ReadLines($filename)) {
    if    ($line | %{$_ -match "Apple"}){Out-File -Append Apples.txt}
    elseif($line | %{$_ -match "Banana"}){Out-File -Append Bananas.txt}
    elseif($line | %{$_ -match "Pear"}){Out-File -Append Pears.txt}
}

csv文件的示例内容:

Apple,Test1,Cross1
Apple,Test2,Cross2
Apple,Test3,Cross3
Banana,Test4,Cross4
Pear,Test5,Cross5

我希望Apples.txt包含:

Apple,Test1,Cross1
Apple,Test2,Cross2
Apple,Test3,Cross3

1 个答案:

答案 0 :(得分:2)

一些事情:

您的if条件不需要% / foreach-object - -match会自行完成:

foreach ($line in [System.IO.File]::ReadLines($filename)) {
  if($line -match "Apple"){
    # output to apple.txt
  }
  else($line -match "Banana"){
    # output to banana.txt
  }
  # etc...
}

由于您实际上没有向Out-File发送任何输出,因此未填充文件:

foreach ($line in [System.IO.File]::ReadLines($filename)) {
  if($line -match "Apple"){
    # send $line to the file
    $line |Out-File apple.txt -Append
  }
  # etc...
}

如果您的文件非常大并且您期望有很多匹配的行,我建议您使用StreamWriter作为输出文件 - 否则Out-File将始终打开和关闭文件:

$OutFiles = @{
  'apple'  = New-Object System.IO.StreamWriter $PWD\apples.txt
  'banana' = New-Object System.IO.StreamWriter $PWD\bananas.txt
  'pear'   = New-Object System.IO.StreamWriter $PWD\pears.txt
}

foreach ($line in [System.IO.File]::ReadLines($filename)) {
  foreach($keyword in $OutFiles.Keys){
    if($line -match $keyword){
      $OutFiles[$keyword].WriteLine($line)
      continue
    }
  }
}

foreach($Writer in $OutFiles.Values){
  try{
    $Writer.Close()
  }
  finally{
    $Writer.Dispose()
  }
}

这样,如果需要更新关键字,您也只需维护$OutFiles哈希表。