2017-03-23 15 views
0

私はPowerShellとプログラミング全般で新しくなっています。問題を説明する前に、まず背景情報を教えてください。PowerShell ForEachは先行ゼロを削除します

私はすべてのトランザクションを$トランザクションに保存しました。各取引はレシーバ,日付および金額です。私は$ 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"} 

レッツ私はあなたがもっと情報を必要とするかどうか知っています誰かが私を助けることができれば本当に感謝しています。

日は次のようになります。あなたのポストから2016年2月25日

+0

日付の表示方法を教えてください。 "dd.MM.yyyy"または "MM/dd/yyyy"など – pandemic

+0

今投稿の最後に追加しました。 – TimoY

+0

私はあなたのコードとその正常な動作をテストしました。変数 '$ Year'を指定しましたか? – pandemic

答えて

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 

(Btw。誰かが、各文字が何をするか、私のために最後に正規表現を説明してもらえます)

確かに:?

. # match any character 
* # zero of more times 
\. # match a literal . (dot) 

独自の例の入力文字列25.02.2016、最初のグループ(.*を)取ること25.02に一致します、\..の直後に一致するので、残りの唯一のものは2016です。

+0

私は本当にこれを理解しようとしています。したがって、$ MonthlyTransactionsハッシュテーブルには2015,2016などのキーと7,11,12などの値があります。 $ MonthlyTransactions [2015] [7]が存在するにもかかわらず、何も返されません。すべき?それは単に "null配列にインデックスできない"と言います 私が達成しようとしているのは、毎月の経費、所得、合計(所得から経費)を得ることです。私はまた、毎月のすべての取引を取得し、それらを "レシーバ"でグループ化し、それぞれの "レシーバ"でどれくらいの金額を費やしているかを計算しようとしています。 – TimoY

+0

さて、私はそれを得たと思う、あなたはこのようにしなければならない: $ MonthlyTransactions ['2015'] ['7']助けてくれてありがとうマティアス! – TimoY

0

これはどういう意味ですか?

$dates = ([DateTime] "1/1/2016"),([DateTime] "1/2/2016"), 
    ([DateTime] "2/1/2016"),([DateTime] "3/1/2016") 
$uniqueMonths = $dates | ForEach-Object { $_.Month } | Sort-Object -Unique 
# $uniqueMonths contains 1,2,3 
関連する問題