Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用PowerShell在同一行中连接两个文件行_Powershell_Powershell 2.0 - Fatal编程技术网

使用PowerShell在同一行中连接两个文件行

使用PowerShell在同一行中连接两个文件行,powershell,powershell-2.0,Powershell,Powershell 2.0,我有两个文件,行数相同,顺序相同 范例 案文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 到目前为止,我尝试使用Join命令并添加内容,但我使用的是第一个集合底部的第二个集合。我只是想把线连成一条线。 我也在考虑创建数据集和循环,但我认为可能有一种更简单的方法,比如Shell中的cat 将这两个文件读入数组,并在常

我有两个文件,行数相同,顺序相同

范例

案文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
到目前为止,我尝试使用Join命令并添加内容,但我使用的是第一个集合底部的第二个集合。我只是想把线连成一条线。
我也在考虑创建数据集和循环,但我认为可能有一种更简单的方法,比如Shell中的cat

将这两个文件读入数组,并在常规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
}

cat
也不会给你这个。我也不太清楚你所说的“加入命令”是什么意思

然而,这并不难。只需读取两个文件,并连接行:

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

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

Math.Max
只需确保无论两个文件是否具有相同的行数,代码仍然有效。

在默认数组生成模式下获取内容的速度非常慢,并且将文件的全部内容保留在内存中,这对大文件不起作用。其他答案在一个4MB、100k行的日志文件上需要10到100秒

使用.NET类IO.StreamReader和IO.StreamWriter在100毫秒内加入4MB文件
和100MB文件,而不是分钟/小时。然而,只有在PS3.0及更高版本中才能看到如此出色的结果,而PS2使用的运行时要慢得多(仍然比获取内容快)

和一个多文件加入器:

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()
}

诚然,速度慢是其他方法的一个问题,但问题中没有任何东西表明它们有多GiB文本文件。偶尔有一些高效处理的示例来证明它在Powershell中是可行的,这很好。很高兴知道。我当前的文件很小,但将来可能会变得更重。谢谢
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()
}