2016-10-10 72 views
1

我有兩個文件具有相同的行數並且順序相同。使用PowerShell在同一行中加入兩個文件行

文本1:

1,MA,DC 
2,NY,BC 
3,CT,CD 

文本2

,PRO,123 
,PRO,ABC 
,GRO,XYZ 

輸出應爲:

1,MA,DC,PRO,123 
2,NY,BC,PRO,ABC 
3,CT,CD,GRO,XYZ 

到目前爲止我嘗試使用加入命令,並添加 - 內容,但我越來越第二盤在第一盤的底部。我只是試圖將行連接到一行。 我也在考慮創建數據集和循環,但我認爲在Shell中可能有更簡單的方法,如cat

回答

2

閱讀這兩個文件到陣列和它們壓縮在一個普通的for循環:

$File1 = Get-Content C:\path\to\file1.txt 
$File2 = Get-Content C:\path\to\file2.txt 

for($i = 0; $i -lt $File1.Count; $i++) 
{ 
    ('{0}{1}' -f $File1[$i],$File2[$i]) |Add-Content C:\path\to\output.txt 
} 
3

cat不會給你,要麼。另外我不太清楚你的意思是「加入命令」。

儘管如此,這並不難。簡單地讀這兩個文件,並連接線:

$a = Get-Content text1 
$b = Get-Content text2 

0..[Math]::Max($a.Length, $b.Length) | ForEach-Object { 
    $a[$_] + $b[$_] 
} 

Math.Max只是確保代碼仍然有效,無論這兩個文件是否具有相同的行數。

1

默認數組生成模式下的Get-Content速度非常慢,並且將文件的全部內容保存在內存中,這對於大文件不會起作用。其他答案需要10和100秒才能在一個4MB的日誌文件中加上10萬行。

使用.NET類IO.StreamReader和IO.StreamWriter加入4MB文件100毫秒
和100MB的文件在2秒內,而不是分鐘/小時。但是,只有在PS3.0和更新的版本中才能看到如此出色的結果,而PS2使用的運行速度要慢得多(仍比Get-Content更快)。

function Join-FileLines (
    [ValidateScript({Test-Path -literal $_})] [string] $file1, 
    [ValidateScript({Test-Path -literal $_})] [string] $file2, 
    [ValidateScript({Test-Path -literal $_ -IsValid})] [string] $output 
) { 
    $a = New-Object IO.StreamReader $file1 
    $b = New-Object IO.StreamReader $file2 
    $c = New-Object IO.StreamWriter ($output, 
            $false, # don't append 
            [Text.Encoding]::UTF8) 
    while (!$a.EndOfStream -or !$b.EndOfStream) { 
     $c.WriteLine($a.ReadLine() + $b.ReadLine()) 
    } 
    $a.Close() 
    $b.Close() 
    $c.Close() 
} 

和多文件木匠:

function Join-FileLines(
    [ValidateScript({Test-Path -literal $_})] [string[]] $files, 
    [ValidateScript({Test-Path -literal $_ -IsValid})] [string] $output 
) { 
    $streams = $files | ForEach { New-Object IO.StreamReader $_ } 
    $streamOut = New-Object IO.StreamWriter ($output, $false, [Text.Encoding]::UTF8) 
    while ($true) { 
     $anyLeft = $false 
     ForEach ($s in $streams) { 
      $anyLeft = $anyLeft -or !$s.EndOfStream 
      $streamOut.Write($s.ReadLine()) 
     } 
     if (!$anyLeft) { break } 
     $streamOut.WriteLine() 
    } 
    ForEach ($s in $streams) { $s.Close() } 
    $streamOut.Close() 
} 
+0

誠然,緩慢與其他方法的問題,但沒有什麼的問題提出他們多吉布文本文件。 – Joey

+0

很高興能夠提供有效的處理示例,然後在PowerShell中顯示它是可行的。 – wOxxOm

+0

很高興知道。我目前的文件很小,但未來可能會變得更重。謝謝! – causita

相關問題