使用Powershell从每个单独的文件中按行合并来自多个文本文件的数据列

时间:2014-10-16 00:17:11

标签: powershell

我有数字建模代码的输出。我需要从一系列文件中提取特定值。我使用以下代码来获取它(我从一个从日志文件中提取IP地址的示例中派生出来):

$input_path = ‘C:\_TEST\Input_PC\out5.txt’
$output_file = ‘C:\_TEST\Output_PC_All\out5.txt’
$regex = ‘\bHEAD(.+)\s+[\-]*\d{1,3}\.\d{6,6}\s?\b’
select-string -Path $input_path -Pattern $regex -AllMatches | % { $_.Matches } | % { $_.Value } > $output_file

所以我现在有了一些文本文件,其中包含一列数字数据的测量值(文件数量可能是变量,目前有50个)(当前数量等于7302但可能会有所不同的行数)取决于建模的时间序列的长度,并且根据下面的示例数据可以是正的或负的。

注意文本前面的分号表示以下内容是我用于解释数据集顺序的注释,而不会出现在要处理的数据中...

out1.txt

  

-1.000000; out1.txt的第1行
   2.000000; out1.txt的第二行
  -3.000000; out1.txt的第3行
  ...
  5.000000; out1.txt的第n行

out2.txt

  

-1.200000;第一行out2.txt
  -2.200000; out2.txt的第二行
   3.200000; out2.txt的第3行
  ...
  -5.20000;第二行out2.txt

outn.txt

  

130万;第一行outn.txt
  -2.300000; outn.txt的第二行
  -3.300000; outn.txt的第3行
  ...
  10.300000; outn.txt的第n行

我需要将它们合并到一个文本文件中(对于此示例,我们可以调用它" Combined_Output.txt")使用Powershell和订购的数据,以便显示来自不同输出文件的第一行值首先,然后对第2行重复此操作,依此类推:

Combined_Output.txt

  

-1.000000; out1.txt的第1行
  -1.200000;第一行out2.txt
  1.300000;第一行outn.txt
  2.000000; out1.txt的第二行
  -2.200000; out2.txt的第二行
  -2.300000; outn.txt的第二行
  -3.000000; out1.txt的第3行
  3.200000; out2.txt的第3行
  -3.300000; outn.txt的第3行
  ...
   5.000000; out1.txt的第n行   -5.200000;第二行out2.txt
   10.300000; outN.txt的第n行

只是说我对这类事情很陌生,所以我希望上面的解释是有道理的,也可以说你能提供的任何帮助都会非常感激。

修改
现在运行模型,当使用此代码创建大型数据文件时,似乎存在导入数据的排序问题。这似乎主要发生在存在重复值时,例如来自每个outfile的第二行数据已由脚本按以下顺序组合。看起来有一些基于数据值的排序,而不仅仅是基于输出文件名:

  

价值;输出文件编号
  -1.215809; 1
  -0.480543; 18个
  -0.480541; 19个
  -0.48054; 2
  -0.480539; 20个
  -0.480538; 21个
  -0.480537; 22个
  -0.480536; 23个
  -0.480535; 24个
  -0.480534; 25个
  -0.480534; 26个
  -0.480688; 10个
  -0.480533; 27个
  -0.480532; 3
  -0.480776; 4
  -0.48051; 5
  -0.48051; 6
  -0.48051; 7
  -0.48051; 8
  -0.48051; 9
  -0.48051; 11个
  -0.48051; 12个
  -0.48051; 13

1 个答案:

答案 0 :(得分:0)

我觉得我可能已经过了复杂的答案,但让我们看看我们是怎么做的。考虑以下类似于您的样本的虚拟数据

Out1.txt    Out2.txt    Out3.txt
-0.40000    0.800000    4.100000
3.500000    0.300000    -0.90000
-2.60000    0.800000    2.200000
0.500000    1.800000    -1.40000
3.600000    1.800000    1.400000
40000000    -0.70000    1.500000

文件内容并排排列,以简洁回答并帮助理解输出。代码如下:

$allTheFiles = @()
Get-ChildItem c:\temp\out*.txt | ForEach-Object{
    $allTheFiles += ,(Get-Content $_.FullName)
}

For ($lineIndex=0; $lineIndex -lt $allTheFiles[0].Count; $lineIndex++){
    For($fileIndex=0; $fileIndex -lt $allTheFiles.Count; $fileIndex++){
        $allTheFiles[$fileIndex][$lineIndex]
    }
} | Out-File -FilePath c:\temp\file.txt -Encoding ascii

收集所有* .txt文件,代码创建一个数组数组,这些数组本身就是文件内容。使用嵌套的For循环循环,但每个文件一次从每个文件输出一行。虽然如果你将样本数据与输出进行比较,我很难清楚发生了什么,你应该看到第一行或每个文件一起输出,然后是下一行......等等。

此代码将生成以下输出

-0.40000
0.800000
4.100000
3.500000
0.300000
-0.90000
-2.60000
0.800000
2.200000
0.500000
1.800000
-1.40000
3.600000
1.800000
1.400000
40000000
-0.70000
1.500000

<强>注意事项

代码假定所有文件大小相同。行数由第一个文件决定。如果其他文件包含更多数据,则会在此模型中丢失。