2015-10-21 51 views
0

我写了一个函数和过滤器来分析CSV文件的内容。功能中指​​定的参数自动传递给过滤器

函数来创建列对象的管道:

function Analyze { 

     [CmdletBinding()] 
     Param(
      [String] 
      $File 
     ) 

     # get column headers from CSV; enumerate 
     $Headers = (Get-Content $File | Select-Object -First 1).Split(',') 
     $Headers | ForEach-Object { 

      # create an object that represents each column; initialize values 
      $Column = [PsCustomObject]@{'Name'=$_;'Measurements'[email protected]()} 

      # add to pipeline 
      $Column 
     } 

} 

过滤器来计算各列的内容的最小值:

filter Min { 

    Param(
     [string]$File 
    ) 

    # create Logparser query 
    $Query = "SELECT Min($($_.Name)) AS Minimum FROM '$File'" 

    # excute query; return results as XML 
    [xml] $xml = & logparser $Query -stats:off -o:xml 

    # create object to contain measurement and its value 
    $Measurement=[PsCustomObject]@{'Name'='Minimum';Value=$xml.root.row.Minimum.Trim()} 

    # add to collection and return to pipeline 
    $_.Measurements+=$Measurement 
    $_ 

} 

过滤器来计算各列的内容的最小值:

filter Max { 

    Param(
     [string]$File 
    ) 

    # create Logparser query 
    $Query = "SELECT Max($($_.Name)) AS Maximum FROM '$File'" 

    # excute query; return results as XML 
    [xml] $xml = & logparser $Query -stats:off -o:xml 

    # create object to contain measurement and its value 
    $Measurement=[PsCustomObject]@{'Name'='Maximum';Value=$xml.root.row.Maximum.Trim()} 

    # add to collection and return to pipeline 
    $_.Measurements+=$Measurement 
    $_ 

} 

用法:

pushd C:\users\<user>\Desktop 
$File = '.\d.csv' 
Analyze -File $File | Min -File $File | Max -File $File 
popd 

有没有办法建筑师这样的过滤器,我可以把它想:

pushd C:\users\<user>\Desktop 
Analyze -File '.\d.csv' | Min | Max 
popd 
+1

您可以通过'Analyze'函数将文件属性添加到对象。 – PetSerAl

+0

@PetSerAl,我认为,但它看起来像一个黑客。也许这是唯一的方法... – craig

+0

如果您希望下一个函数使用它,您必须以某种方式返回到管道。 – Matt

回答

0

基于@Mathias R.杰森的意见,我重构功能和过滤器:

function Analyze { 

    [CmdletBinding()] 
    Param(
     [Parameter(Mandatory=$True,Position=1)] 
     [alias('f')] 
     [String] 
     $File, 

     [Switch] $Min, 
     [Switch] $Max, 
     [Switch] $Top 
    ) 

    # get column headers from CSV; enumerate 
    $Included = (Get-Content $File | Select-Object -First 1).Split(',') 

    $Included | ForEach-Object { 

     # create a hash that represents each column; initialize values 
     $Column = [PsCustomObject]@{'Name'=$_;'Measurements'[email protected]()} 

     # apply specified filter; pass object via pipeline 
     if ($Min) { $Column | Min -File $File } 
     if ($Max) { $Column | Max -File $File } 
     if ($Top) { $Column | Top -File $File } 

     # add to pipeline 
     $Column 

    } 

} 

所需禁用过滤器的管道:

filter Min { 

    [Parameter(Mandatory=$True,Position=1)] 
    [alias('f')] 
    Param(
     [string]$File 
    ) 

    $Query = "SELECT Min([$($_.Name)]) AS Minimum FROM '$File'" 

    [xml] $xml = & logparser $Query -stats:off -o:xml 
    $Measurement=[PsCustomObject]@{'Name'='Minimum';Value=$xml.root.row.Minimum.Trim()} 

    $_.Measurements+=$Measurement 

    # pipeline disabled; created multiple instances of Column object 
    #$_ 

} 

# similar changes to these filters 
filter Max {} 
filter Top {} 

用法:

pushd C:\users\<user>\Desktop 
$File = '.\data.csv' 
Analyze $File -Min -Max -Top 
popd 
相关问题