好的,我有 24 個子資料夾,名為 Angle1、Angle2 等,直到 Angle24,每個子資料夾都有一個名為 output.txt 的檔案。請注意,這些資料夾有我想忽略的子資料夾。
有沒有辦法循環遍歷這些資料夾並取得第 9 列資料(不是按字元取得第 9 列,資料可以是幾個字元長,但每列之間用空格分隔)。並將所有output.txt 檔案中的每個第9 欄放入父目錄中名為total.txt 的新檔案中?所以我最終會創建一個名為total.txt的文件,其中包含24列數據,其中第一列對應於Angle1中output.txt的第9列,依此類推。
我需要在 powershell 中完成此操作。
答案1
powershell 命令列,建立目錄,運行於D:\Data Set\
:
powershell 1..24^|%{md ('Angle'+$_)}
powershell命令列,建立測試資料:
powershell $i=0;$d='D:\Data Set\';$r=New-Object -T Random;1..24^|%{++$i;1..(random(11..17))^|%{$s='';1..20^|%{$rn=$r.Next();$s+=''+$rn+' '};$s.Trim();$s^|ac ($d+'Angle'+$i+'\output.txt')}}
- $r=New-Object -T Random - 建立隨機對象
- $s.Trim() - 刪除字串左右兩側的空格
運行powershell檔案:
powershell .\PasteD.ps1
PasteD.ps1,取得並寫入列:
$d='D:\Data Set\' # work directory
$FileNum=24 # part path and filename
$Coln=9 # - 9th column
$LineMax=0 # init variable maximum line at text file
$dlm=' ' # delimiter
$i=0;1..$FileNum|%{++$i;$LineMax=[Math]::Max($LineMax,(gc ($d+'Angle'+$i+'\output.txt')|Measure).Count)}
# (gc <file name>|Measure).Count) - get line count at text file
# [Math]::Max - get Maximum line count at all file
# 1..$FileNum - cycle at Angle1, Angle2, etc up to Angle24 directory
# way init array:
#$arS =,''*$LineMax
#$arS =@('')*$LineMax
#$arS=[array]::CreateInstance('String', $LineMax)
#$arS=New-Object 'object[]' $LineMax
[string[]]$arS=@('')*$LineMax
For($i=0; $i -lt $FileNum-1; $i++) {
$f=gc ($d+'Angle'+($i+1)+'\output.txt') # get content file in Angle1..Angle23 dir
For($j=0; $j -lt $f.length; $j++) {
$arS[$j]=$arS[$j] + ($f[$j]-split' ')[$Coln-1] + $dlm # add value and delimiter
}
For($j=$f.length; $j -lt $LineMax; $j++) {
$arS[$j]=$arS[$j] + $dlm # add delimiter and empty value
}
}
$f=gc ($d+'Angle'+($FileNum)+'\output.txt') # get content file in Angle24 dir
For($j=0; $j -lt $f.length; $j++) {
$arS[$j]=$arS[$j] + ($f[$j]-split' ')[$Coln-1] # after last column not add delimiter
}
$arS|ac($d+'\total.txt') # save string array to result file