在Powershell中分析CSV

时间:2017-06-30 19:22:40

标签: powershell csv

我对Powershell很新(大约1天更精确),我假设有一些变量的语法问题。我有一个CSV文件电子表格(从Excel xlsx转换而来),大约有21列和74,000行。我感兴趣的四个栏目是与员工开始日期,终止日期,部门名称和他们报告的副总裁有关的栏目。我正在尝试编写一个脚本,该脚本将返回所有已达到开始日期,未被终止的员工,在包含人力资源部门的部门工作。在名称中,并向特定的VP报告。我将在代码块之后详细说明我的具体问题。

    $Lawson = Import-Csv .\Documents\Lawson_HR.csv 

PS C:\Users\louiez> $startDate = $Lawson | where {$_.'LAW HIRE DATE' -le (Get-Date -format M-DD-YYYY)} 

PS C:\Users\louiez> $endDate = $startDate | where {$_.'LAW TERM DATE' -eq ''} 

PS C:\Users\louiez> $HR = $endDate | where {$_.'LAW DEPT NAME' -contains 'HR'}

PS C:\Users\louiez> $VP = $endDate | where {$_.'VICE PRESIDENT' -contains 'Croner'}


PS C:\Users\louiez> $startdate | Measure-Object
Count    : 51641
Average  : 
Sum      : 
Maximum  : 
Minimum  : 
Property :  

PS C:\Users\louiez> $enddate | Measure-Object  
Count    : 19428
Average  : 
Sum      : 
Maximum  : 
Minimum  : 
Property :  

PS C:\Users\louiez> $HR | Measure-Object
Count    : 0
Average  : 
Sum      : 
Maximum  : 
Minimum  : 
Property :  

首先,startDate变量不计算正确的项目数。我想计算员工雇用日期在今天之前的所有行。当前的代码返回约51k项,应该是73k左右。 (endDate变量的功能应该如此。)

第二个HR变量返回0项,应该是几百个。我希望它能够在每行中的Dept Name字段中搜索字母“HR'”上的任何实例。同样,我希望VP变量返回副总统列具有给定名称的所有项目(在本例中为Croner)。

正如我所说,我对Powershell非常新,并且编程经验非常有限,所以我不确定语法中是什么导致了这些错误。

1 个答案:

答案 0 :(得分:4)

您的设计存在一些缺陷,很容易:

$_.'LAW DEPT NAME' -contains 'HR'
$_.'VICE PRESIDENT' -contains 'Croner'

-contains不直观,与文本内容不匹配,它与多个项目的容器中的项目匹配。 Help about_Comparison_Operators了解详情。请改用-match

$_.'LAW DEPT NAME' -match 'HR'
$_.'VICE PRESIDENT' -match 'Croner'

第二个更复杂:

$_.'LAW HIRE DATE' -le (Get-Date -format M-DD-YYYY)

$_.'LAW HIRE DATE'可能会返回一个文本字符串,带-format参数的get-date将返回一个文本字符串,-le将按字母顺序排序(带调整)这将完全不可靠,说2月1日是在1月2日之前,因为它从1开始。

字母顺序排序在yyyy-MM-dd之类的日期格式上更有效,但作为wOxxOm评论,正确的方法是将CSV中的日期处理为 一个[datetime]对象,然后将其与当前日期作为[datetime]对象进行比较。这将更可靠地进行比较(给予或考虑时区和夏令时考虑因素)。

[datetime]::ParseExact($_.'LAW HIRE DATE', 'dd-MM-yyyy', $null) -le (Get-Date)

假设LAW HIRE DATE始终采用dd-MM-yyyy格式,否则会失败并且您必须进行调整以适应您的数据 - 或者调整您的电子表格以适合您的代码。