经过一周的尝试,我不得不问你这个问题。
文件输入:
DD/MM
27,28
14,21
1
15
7
12
2,15
25
此文件的每一行代表一个月,所以即使它是空的,它仍然应该算在内,以便可以进行格式化。然后基于文件输入,期望的输出是:
期望的输出:
DD/MM
27/02
28/02
14/04
21/04
01/05
15/06
07/09
12/10
02/11
15/11
25/12
到目前为止我得到了什么并卡在这里:
#getting the content into an array and formatting the .DAT file
$lines = Get-Content $outfileBR
If ($lines[0] -eq "DD/MM") {
$HEADER = $lines[0] + $linebreak
}
If ($lines[1] -eq '') {
continue
} Else {
$BRFILE = $lines[1].SUBSTRING(0,2) + "/01" + $linebreak
$BRFILE += $lines[1].SUBSTRING(3,2) + "/01" + $linebreak
}
If ($lines[2] -eq '') {
continue
} Else {
$BRFILE2 = $lines[2].SUBSTRING(0,2) + "/02" + $linebreak
$BRFILE2 += $lines[2].SUBSTRING(3,2) + "/02" + $linebreak
}
If ($lines[3] -eq '') {
continue
} Else {
$BRFILE3 = $lines[3].SUBSTRING(0,2) + "/03" + $linebreak
$BRFILE3 += $lines[3].SUBSTRING(3,2) + "/03" + $linebreak
}
Set-Content $BRdatFile ($HEADER + $BRFILE + $BRFILE2 + $BRFILE3)
结果:
DD/MM
/01
/01
27/02
28/02
/03
/03
就像我说的,每一行都代表一个月,但如果该行是空的(如输入文件中所示),我将不会在输出中显示它。但在我的结果中,一月显示为/01,三月显示为/03,依此类推。
请问我做错了什么?
请您参考如下方法:
与 Ronald Rink 'd-fens' 给出的答案非常相似,我会在一个循环中做一个循环,但是因为我们知道文件中应该有多少行,所以我会这样做:
#Get content of input file
$FileIn = Get-Content C:\Path\To\File.txt
#Start array for output with header record
[array]$FileOut += 'DD/MM'
#Loop 12 times, once for each month
ForEach($Month in (1..12)){
#Split the relevant line, and for each entry add a line to the output file
If([string]::IsNullOrEmpty($FileIn[$Month])){Continue}
$FileIn[$Month].Split(',') | ForEach{
$FileOut += '{0}/{1}' -f $_, $Month
}
}
#Output the new file
$FileOut | Set-Content C:\Path\To\NewFile.txt
编辑:我修复了 2 个问题。我有 [1..2],它应该是 (1..12),并使用 $_
引用而不是 $Month
(无论如何应该工作,但是这是不好的形式恕我直言)。