【问题标题】:Select and export minimum value from CSV using Powershell使用 Powershell 从 CSV 中选择并导出最小值
【发布时间】:2016-08-16 11:36:48
【问题描述】:

我有两个关于使用 powershell 从 CSV 文件中导出信息的问题。我真的没有太多编码/使用 powershell 的经验,而且我一直在从在线教程/论坛等中破解一些代码。

我有一个包含 CSV 文件的文件夹,其中包含许多列。我正在编写的第一段代码是从每个以“_HIPOTS.csv”结尾的文件中提取包含“CSEP DDS 匹配”或“CSEP 不匹配”的每一行,并将其导出到一个新文件中。我的代码是:

$path = "S:\TEST AREA\ac00418\OpsPlan\Test\Output\FY1\*.*"; # Directory containing csv files 

$csvFiles = Get-ChildItem -Path $path -Filter *_HIPOTS.csv; # Get the csv files
$destination = "S:\TEST AREA\ac00418\OpsPlan\Test\Output\FY1_CSEP_HighPotentials.csv"

#$content = $null
$content = @()

ForEach($csv in $csvFiles){
#IMPORT
        $nodes = import-csv $csv.Fullname
        $CSEPs = $nodes|where {$_.NodeSymbolName -match "CSEP DDS Matched" -and $_.NodeSymbolName -match "CSEP Unmatched"}
        $allCSEPs += $CSEPs
}

$allCSEPs|Export-csv $destination -NoTypeInformation

问题是,当我运行它时,它没有搜索“CSEP Unmatched”,而且它似乎在 for 循环中运行了两到三遍,因为导出中似乎有很多重复项。有人可以帮忙吗?

第二个问题是我必须从每个文件的另一列中导出包含最小值的行。我有一个与第一个类似的代码,只是我不知道如何从列中选择最小值:

$path = "S:\TEST AREA\ac00418\OpsPlan\Test\Output\FY1\*.*"; # Directory containing csv files 
$csvFiles = Get-ChildItem -Path $path -Filter *_HIPOTS.csv; # Get the csv files
$destination = "S:\TEST AREA\ac00418\OpsPlan\Test\Output\LowestNodePressure.csv"

#$content = $null
$content = @()



ForEach($csv in $csvFiles){
#IMPORT
        $nodes = import-csv $csv.Fullname
        $min = Measure-Object -Property $_.NodePressure -Minimum

        $minpressure += $min
}

$minpressure|Export-csv $destination -NoTypeInformation

以下是信息显示方式的示例。请记住,有数以千计的此类列和更多列。这些只是我正在尝试编写的代码的相关代码。

NAME              NodeSymbolName    NodePressure    NodeResultFlow
6430050001023     CSEP Unmatched        24                -25
60200100000007    CSEP DDS Matched      49                -106
60200100000072    CSEP DDS Matched      25                -157
60200100000148    CSEP DDS Matched      35                -9

我为这个庞大的帖子道歉,但我想我还不如用一块石头杀死两只鸟!希望我已经足够清楚我想要实现的目标。感谢任何人提供的任何帮助。

谢谢,

J

【问题讨论】:

  • 在第一个示例的Where-Object 子句中使用-or 而不是-and
  • 另外,你不是多次运行脚本(->重复)吗?
  • 您好,非常感谢您的回复。我更改了 - 并且更改为 - 或者现在包含了不匹配的 CSEP,但我仍然得到重复。我没有多次运行脚本。我只是使用 for 循环读取文件夹中的每个文件一次,因此相同的信息应该只导出一次。
  • $content = @() 是干什么用的?
  • 嗨,克里斯,有人告诉我应该声明一个空数组,以便将所有内容导出到其中。直到现在我才意识到我的意思是写 $allCSEPs = @() 这是一个非常愚蠢的错误。不再重复!不过,仍然有点不确定如何从 NodePressure 列中取出最小值。感谢您迄今为止的帮助。

标签: csv powershell export minimum


【解决方案1】:

好的,让我们把它总结在一个答案中,而不仅仅是 cmets。这里有几个问题,让我们从头开始:

未同时收集“CSEP DDS 匹配”和“CSEP 不匹配”

当然,没问题。如 cmets 中所述,您希望使用 -or 运算符,而不是 -and 运算符。更正行:

        $CSEPs = $nodes|where {$_.NodeSymbolName -match "CSEP DDS Matched" -or $_.NodeSymbolName -match "CSEP Unmatched"}

更好的是,-match 运算符可以处理正则表达式(通常称为 RegEx),因此我们可以将整个内容缩短为:

        $CSEPs = $nodes|where {$_.NodeSymbolName -match "CSEP (DDS |un)Matched"}

RegEx 查看括号内的内容并将管道用作匹配其中任何选项的分隔符,因此这两种情况都适用。整齐吧?继续!

重复

是的,没有人喜欢这些,但我敢打赌,这是一个重用会话和脏变量的问题。解决这个问题的最好方法是删除脚本末尾的变量。在调试时,只需在需要时注释掉这些行,然后在准备好时取消注释。

Remove-Variable allCSEPs, nodes, CSEPs, LowestNode

每个文件的最低NodePressure

好的,既然您希望每个文件都使用它,那么您首先应该在浏览文件时收集这些文件,所以让我们在初始循环中添加一行。没有理由多次导入这些 CSV,对吧?我们将从第一个循环中查看您的匹配项,对它们进行排序,然后选择第一个,并将该记录添加到不同的变量以单独输出。

[array]$LowestNodes += $CSEPs | Sort NodePressure | Select -First 1

看看我在那里做了什么?我将$LowestNode 声明为一个数组,因此我可以使用+= 收集对象或字符串的集合或其他任何东西,而不必先将其声明为空数组。

因此,您有 1 个循环(将它们全部统治),它可能看起来像这样:

$path = "S:\TEST AREA\ac00418\OpsPlan\Test\Output\FY1\*.*"; # Directory containing csv files 

$csvFiles = Get-ChildItem -Path $path -Filter *_HIPOTS.csv; # Get the csv files
$destination = "S:\TEST AREA\ac00418\OpsPlan\Test\Output\FY1_CSEP_HighPotentials.csv"
$destination2 = "S:\TEST AREA\ac00418\OpsPlan\Test\Output\LowestNodePressure.csv"

ForEach($csv in $csvFiles){
#IMPORT
        $nodes = import-csv $csv.Fullname
        $CSEPs = $nodes|where {$_.NodeSymbolName -match "CSEP (DDS |un)Matched"}
        [array]$LowestNodes += $CSEPs | Sort NodePressure | Select -First 1
        [array]$allCSEPs += $CSEPs
}

$allCSEPs|Export-csv $destination -NoTypeInformation
$LowestNodes|Export-csv $destination2 -NoTypeInformation
Remove-Variable allCSEPs, nodes, CSEPs, LowestNodes

【讨论】:

  • 您好 MadTechnician,非常感谢您的帮助!我真的很感激崩溃。删除变量命令很有效,但我也意识到我没有在循环之前声明一个空数组(或至少正确命名),所以这会导致问题。最低节点问题绝对是我遇到最多的问题,所以这是一个很大的帮助。我没有完全掌握不同的命令,所以 sort| select -First 是一个巨大的帮助。无论如何,我现在一切都在运行! J
猜你喜欢
  • 2022-11-02
  • 1970-01-01
  • 2015-06-14
  • 1970-01-01
  • 1970-01-01
  • 2023-03-11
  • 1970-01-01
  • 2019-06-09
  • 2020-08-06
相关资源
最近更新 更多