[英]Importing Data From CSV in Powershell Providing UK Date in CSV is Less Than 7 Days Away
所以我有一個帶有 5 個標題的 CSV 文件:名稱、集合日期、位置、設備注釋、經理。
現在我的 collectionDates 都是英國格式,所以 DD/MM/YYYY。 我只想從 CSV 導入數據,其收集日期為未來 7 天或更短。 所以今天是 17/08,因此我只想從 17/08 到 24/08 之間的 CSV 中提取數據。
盡管如果你告訴它,Powershell 可以處理英國格式的日期時間對象,但我似乎無法操縱日期以添加 7 天。
這是我當前的代碼:
$today = Get-Date
$thisWeek = $today.AddDays(7)
$thisWeekString = $thisWeek.ToString()
$dateParts = $thisweekString -split " "
$weekFinal = $dateParts[0]
$import = Import-Csv @("\\location\EmailCSV.csv") | Where-Object {$_.collectionDate -lt $weekFinal}
Powershell 正確地將 7 天添加到日期時間以使其成為 24/08,然后將其轉換為字符串並從中刪除時間時,它正確地將該變量設置為 24/08/2018。 但是當我在導入 cmdlet 中比較它們時,它只返回 CSV 中的所有數據,而不是小於 24/08 的日期。
我也知道 Powershell 可以比較這些,因為如果我創建一個單獨的變量 $otherDate,其中包含 24/08/2018,然后創建一個 if 語句來檢查 $weekFinal 是大於還是小於 $otherDate,它會正確運行該語句當真。
我嘗試在 Import-Csv cmdlet 中同時使用 Where 和 Where-Object,但都返回了相同的結果。
如何讓 Powershell 正確比較 $_.collectionDate 和 $weekFinal 以過濾從 csv 導入的數據?
使用[datetime]
實例執行所有計算和比較是最簡單的 - 避免字符串操作(將日期的字符串表示形式轉換為[datetime]
實例除外)。
首先,將今天的日期和從現在起 1 周的日期表示為沒有時間組件的[datetime]
實例:
$today = (Get-Date).Date # Today's date, without a time component (midnight)
$oneWeekFromToday = $today.AddDays(7)
然后使用[datetime]::Parse()
將感興趣的總是字符串類型的 CSV 列值轉換為[datetime]
實例,以便您可以執行適當的日期比較。
$import = Import-Csv \\location\EmailCSV.csv | Where-Object {
$thisDate = [datetime]::Parse($_.collectionDate)
# Process this row if its date falls between today and 1 week from now, inclusively.
$thisDate -ge $today -and $thisDate -le $oneWeekFromToday
}
重要提示:使用[datetime]::Parse('...')
,而不是[datetime] '...'
cast ,因為只有[datetime]::Parse()
尊重當前文化的日期和時間格式; 按照設計,PowerShell 的強制轉換和字符串插值始終使用不變文化,而不管當前的文化如何 - 有關更多信息,請參閱我的這個答案。
嘗試在比較中將字符串轉換為[datetime]
。 當使用一組樣本數據時,我能夠得到預期的結果。
$import = Import-Csv @("\\location\EmailCSV.csv") | Where-Object {[datetime]$_.collectionDate -lt [datetime]$weekFinal}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.