2016-10-10 10 views
1

同じ数の行と同じ順序の2つのファイルがあります。PowerShellと同じ行に2つのファイル行を結合します。

テキスト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 

これまでのところ私は、コマンドに参加して、追加使用してみました - 内容はわかりましたが第2の組は第1の組の底部にある。私はただ一つの行に行を結合しようとしています。 データセットとループを作成することも考えていますが、シェルでの猫のような簡単な方法があると思っていました。

答えて

2

配列に両方のファイルを読み、forループ定期的にそれらをzip圧縮:

$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はあなたのいずれかのことを与えることはありません。また、私はあなたが "join command"を意味するかどうかはよく分かりません。

それでも、これはあまり難しくありません。単純に両方のファイルを読み込み、行連結:

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

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

Math.Maxは、単にコードはまだかかわらず、両方のファイルが同じ行数を持っているかどうかに動作することが保証されます。

1

デフォルトの配列作成モードのGet-Contentは非常に遅く、ファイルの内容全体をメモリに保持します。これは巨大なファイルでは機能しません。他の回答は、100k行の4MBログファイルで10秒と100秒かかる。

使用.NETクラスIO.StreamReaderとIO.StreamWriterではなく、分/時間の2秒で100ミリ秒
と100MBのファイルに4MBのファイルを結合します。しかし、このような優れた結果は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

関連する問題