2017-03-20 17 views
-2

CSVファイルを処理するための小さなPowerShellスクリプトを作成中です。Import-CSV date-column -lt/-gt(dd.MM.YYYY)

CSVファイルの例:

"lastname";"firstname";"birthday" 
"meier";"bernd";"23.06.1976" 
"hoffmann";"sven";"12.04.1955" 
"berger";"tim";"14.15.2007"

スクリプトは、ユーザーが2つのdatapickersで日付を選択することができ、ウィンドウを作成し、ユーザが誕生日の前か後にあるすべての行を削除することができすべき選択された日付。

Function Start-MyImport { 
    #Build the GUI 
    [xml]$xaml_ar = @" 
<Window 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     Title="Title" Height="164.653" Width="498.907" ResizeMode="NoResize" Topmost="True" WindowStartupLocation="CenterScreen"> 
    <Grid> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="27*"/> 
      <ColumnDefinition Width="464*"/> 
     </Grid.ColumnDefinitions> 
     <Button Name="agerange_go" Content="go!" HorizontalAlignment="Left" Height="23" Margin="334,71,0,0" VerticalAlignment="Top" Width="96" Grid.Column="1"/> 
     <CheckBox Name="agerange_before" Content="birthday before:" Grid.Column="1" HorizontalAlignment="Left" Margin="18,76,0,0" VerticalAlignment="Top"/> 
     <CheckBox Name="agerange_after" Content="birthday after:" Grid.Column="1" HorizontalAlignment="Left" Margin="18,103,0,0" VerticalAlignment="Top"/> 
     <DatePicker Name="dp_before" Grid.Column="1" HorizontalAlignment="Left" Margin="176,71,0,0" VerticalAlignment="Top"/> 
     <DatePicker Name="dp_after" Grid.Column="1" HorizontalAlignment="Left" Margin="176,98,0,0" VerticalAlignment="Top"/> 

    </Grid> 
</Window> 
"@ 

    $reader_ar = (New-Object System.Xml.XmlNodeReader $xaml_ar) 
    $Window_ar = [Windows.Markup.XamlReader]::Load($reader_ar) 

    $xaml_ar.SelectNodes("//*[@*[contains(translate(name(.),'n','N'),'Name')]]") | ForEach { 
     Set-Variable -Name ($_.Name) -Value $Window_ar.FindName($_.Name) 
    } 

    #Events 
    $agerange_go.Add_Click({ 
     if ($agerange_before.IsChecked) { 
      $dp_before = $dp_before.Text 
      if ($dp_before -ne "") { 
       Write-Host $dp_before 
       Import-Csv my.csv -Delimiter ";" -Encoding UTF8 | 
        where birthday -as[DateTime]::ParseExact($_."birthday", "dd.MM.YYYY", $null) -lt $dp_before | 
        Export-Csv CsvFileOut.csv -Delimiter ";" -Encoding UTF8 -NoTypeInfo 
      } 
     } 
     $Window_ar.Close() 
     #Lieferant-Repl 
    }) 
    $Window_ar.ShowDialog() | Out-Null 
} 

Start-MyImport 

問題は、誕生日の列を日付に解析できないことです。私のやり方はうまくいかない。

where birthday -as[DateTime]::ParseExact($_."birthday", "dd.MM.YYYY", $null) -lt $dp_before 

これを正しく処理するにはどうすればよいですか?

+0

をIIRC日付形式の月だけ大文字である、あなたは「DD.MM.YYYY」をしようとしましたか? – LotPings

答えて

2

エラーメッセージをよく読んで注意してください。 (そして、ところで、私たちにエラーメッセージが表示されます。ちょうどそれが動作しないことを言ってはいけない。有用ではないこと。)

C:\> [DateTime]::ParseExact("23.06.1976", "dd.MM.YYYY", $null) 
Exception calling "ParseExact" with "3" argument(s): "String was not recognized as a valid DateTime." 

ように、2つの文字列のいずれかが間違っています。日付は大丈夫です。つまり、format stringを見て、実際には「YYYY」というものはないことがわかります。私たちは「YYYY」にそれを修正した場合、それは動作します:

C:\> [DateTime]::ParseExact("23.06.1976", "dd.MM.yyyy", $null) 

Wednesday, 23 June 1976 12:00:00 AM 
関連する問題