根据字符串解析和拆分文件

Parsing and splitting files based on the string

我有一个非常大的文件(因此是 .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

两件事:

您的 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 哈希表。