PowerShell ForEach删除前导零

时间:2017-03-23 21:37:26

标签: powershell

我对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

2 个答案:

答案 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