1

如何使用来自两个不同文本文件的组合行创建文件并创建像这样的新文件:

First line from text file A
First line from text file B
Second line from text file A
Second line from text file B
...
4

2 回答 2

4

对于一个解决方案:

  • 保持内存使用不变(不会预先将整个文件加载到内存中)
  • 对较大的文件执行可接受。

需要直接使用 .NET API

# Input files, assumed to be in the current directory.
# Important: always use FULL paths when calling .nET methods.
$dir = $PWD.ProviderPath
$fileA = [System.IO.File]::ReadLines("dir/fileA.txt")
$fileB = [System.IO.File]::ReadLines("$dir/fileB.txt")

# Create the output file.
$fileOut = [System.IO.File]::CreateText("$dir/merged.txt")

# Iterate over the files' lines in tandem, and write each pair
# to the output file.
while ($fileA.MoveNext(), $fileB.MoveNext() -contains $true) {
  if ($null -ne $fileA.Current) { $fileOut.WriteLine($fileA.Current) }
  if ($null -ne $fileB.Current) { $fileOut.WriteLine($fileB.Current) }
}

# Dipose of (close) the files.
$fileA.Dispose(); $fileB.Dispose(); $fileOut.Dispose()

注意:.NET API 默认使用 UTF-8,但如果需要,您可以传递所需的编码。

另请参阅:相关的 .NET API 帮助主题:


仅使用 PowerShell 功能的解决方案:

  • 注意:使用仅 PowerShell 的功能,您一次只能懒惰地枚举一个文件的行,因此需要将另一个文件完全读入内存。(但是,您可以再次通过 .NET API 使用惰性可枚举,即System.IO.File]::ReadLines()如上所示,或者预先将两个文件全部读入内存。)

  • 可接受性能的关键是只有一个 Set-Content调用(可能加上一个 Add-Content调用)来处理所有输出行。

    • 但是,考虑到Get-Content(没有-Raw)本身非常慢,由于使用附加属性装饰读取的每一行,基于 .NET API 的解决方案的性能将明显更好
# Read the 2nd file into an array of lines up front.
# Note: -ReadCount 0 greatly speeds up reading, by returning
#       the lines directly as a single array.
$fileBLines = Get-Content fileB.txt -ReadCount 0 

$i = 0 # Initialize the index into array $fileBLines.

# Lazily enumerate the lines of file A.
Get-Content fileA.txt | ForEach-Object {
  $_ # Output the line from file A.
  # If file B hasn't run out of lines yet, output the corresponding file B line.
  if ($i -lt $fileBLines.Count) { $fileBLines[$i++] }
} | Set-Content Merged.txt

# If file B still has lines left, append them now:
if ($i -lt $fileBLines.Count) {
  Add-Content Merged.txt -Value $fileBLines[$i..($fileBLines.Count-1)]
}

注意:Windows PowerShellSet-Contentcmdlet 默认为“ANSI”编码,而PowerShell (Core) (v6+) 使用 BOM-less UTF-8;根据需要使用-Encoding参数。

于 2021-05-30T17:34:56.313 回答
2
$file1content = Get-Content -Path "IN_1.txt"
$file2content = Get-Content -Path "IN_2.txt"

$filesLenght =@($file1content.Length, $file2content.Length)

for ($i = 1; $i -le ($filesLenght | Measure-Object -Maximum).Maximum; $i++)
{   Add-Content -Path "OUT.txt" $file1content[$i]
    Add-Content -Path "OUT.txt" $file2content[$i]
}
于 2021-05-30T16:15:32.787 回答