我对PowerShell和一般编程有点新意,所以我希望你在阅读本文时有一些耐心。在我解释我的问题之前,我觉得我必须首先告诉你一些背景信息:
我将所有交易保存在$ Transactions中。每笔交易都有 Receiver , Date 和 Amount 。
我已按以下方式将年度交易分组为$ TransactionsPerYear:
$TransactionsPerYear = $Transactions | Group-Object { [int]($_.date -replace '.*\.') }
(顺便说一下。有人能为我解释一下这个正则表达式,每个角色的作用是什么吗?)
我接下来要做的是将年收入和支出分成不同的变量。在此之后,我试图从每年中提取月份并将它们保存到$ Months。日期格式为dd.MM.yyyy
问题1:
以下是我如何获取所有日期,但如何提取这几个月?
$TransactionsPerYear | Select -ExpandProperty Group | Select -ExpandProperty date | Select -Unique
问题2:
因为我不知道如何提取月份,所以我已经尝试过以下方式:
[String[]]$Months = "01","02","03","04","05","06","07","08","09","10","11","12"
当我每个月都在$ Months时,我试图获得每月交易并将其保存到新变量中:
ForEach($Month in $Months){
New-Variable -Name "Transactions_$Month$Year" -Value ($Transactions | Where {$_.Date -like "*.$Month.$Year"} | Group-Object 'Receiver' | Select-Object Count, Name, @{L="Total";E={$_ | Select -ExpandProperty Group | Measure-Object Amount -Sum | Select -ExpandProperty Sum}} | Sort-Object {[double]$_.Total})
}
我在这里面临的问题是ForEach从每个月删除了前导零,当发生这种情况时,ForEach中的这一部分与任何东西都不匹配,并且新变量为null:
Where {$_.Date -like "*.$Month.$Year"}
如果您需要更多信息,请与我们联系。如果有人能帮助我,我真的很感激。
日期如下:25.02.2016
答案 0 :(得分:3)
从你的帖子来看,你似乎已经超越了必要的拉比赛。
不是每次需要与Date
属性进行交互时都尝试进行字符串操作,只需将其转换为DateTime
对象即可!
$Transactions = $Transactions |Select-Object *,@{Name='DateParsed';Expression={[datetime]::ParseExact($_.Date, 'dd.MM.yyyy', $null)}}
DateTime.ParseExact()
方法允许我们指定格式(例如dd.MM.yyyy
),并解析日期的字符串表示。
现在,您可以通过以下方式对年份进行分组:
$TransactionsPerYear = $Transactions |Group-Object { $_.DateParsed.Year }
要按年份和月份进行分组,我会创建一个嵌套的哈希表,如下所示:
# Create a hashtable, containing one key per year
$MonthlyTransactions = @{}
foreach($Year in $Transactions |Group {$_.DateParsed.Year})
{
# Create another hashtable, containing a key for each month in that year
$MonthlyTransactions[$Year.Name] = @{}
foreach($Month in $Year.Group |Group {$_.DateParsed.Month})
{
# Add the transactions to the Monthly hashtable
$MonthlyTransactions[$Year.Name][$Month.Name] = $Month.Group
}
}
现在,您可以通过执行以下操作来计算特定月份的交易价值:
$TotalValueMay2010 = ($MonthlyTransactions[2010][5] |Measure-Object Amount -Sum).Sum
(顺便说一下。有人能为我解释一下这个正则表达式,每个角色的作用是什么吗?)
不确定
. # match any character
* # zero of more times
\. # match a literal . (dot)
使用您自己的示例输入字符串25.02.2016
,第一个组(.*
)将匹配25.02
,而\.
将匹配.
权限之后,唯一剩下的就是2016
。
答案 1 :(得分:0)
你是说这个吗?
File