【问题标题】:Powershell Import-Csv Number of ResultsPowershell Import-Csv 结果数
【发布时间】:2012-06-22 17:58:23
【问题描述】:

我想检查 .csv 数据库的“代码”属性的值。如果“代码”字段的前三个字符等于 (-eq) 到“产品”的前三个字符,则显示结果数(计数)并将输入添加到 .csv 数据库。

但是,计数并没有显示为结果为空。

foreach ($row in $InventoryContents) 
{
    #Lets build a String first
    $exportString = $row.User +','+$row.Product+','+$row.Company+','+$row.Model+',';
    #Everything right so far

    #first three characters of Product
    $firstKey = $row.Product.SubString(0,3).ToUpper()
    echo $firstKey;

    #problem here
    $nonSortedContents = Import-Csv $nonSortedCsv | where-Object { ($_.Code.split('-')[0]) -eq $firstKey }
    #but arrapently this works : Import-Csv $nonSortedCsv| where-Object { ($_.Code.split('-')[0]) -eq "MON"}


    $lines = $nonSortedContents.count
    echo $lines
    #null


    #if not enetered
    if ($lines -eq $null)
    {
            $wholeKey = $firstKey +'-'+  ("{0:D5}" -f 0).ToString()
            $exportString = $exportString + $wholeKey
            $exportString -join  "," >> $nonSortedCsv
    }
    else
    {
            $wholeKey = $firstKey +'-'+  ("{0:D5}" -f $lines).ToString()
            $exportString = $exportString + $wholeKey
            $exportString -join  "," >> $nonSortedCsv
    }
}

我可以使用它

$nonSortedContents = @(Import-Csv $nonSortedCsv | where-Object { ($_.Code.split('-')[0]) -eq $firstKey })

显然,当 CSV 文件中只有一行时,Import-Csv 返回一个 PS自定义对象。当多于一行时,返回的对象是一个 对象[]。

【问题讨论】:

  • 谢谢。遇到同样的问题。

标签: string powershell csv


【解决方案1】:

我对条件填充数组也有类似的问题:

$csv = if ($someCondition) {
  @(Import-CSV someFile.csv)
} else {
  @(Import-CSV someFile.csv | Where-Object { $_.someColumn -eq "someValue" })
}

然而,仅仅用数组符号@(...) 包围Import-CSV 行是不够的。就我而言,我还必须将变量显式声明为数组 ([array] $csv)。例如:

[array] $csv = if ($someCondition) {
  @(Import-CSV someFile.csv)
} else {
  @(Import-CSV someFile.csv | Where-Object { $_.someColumn -eq "someValue" })
}

我从这里得到提示:http://poshoholic.com/2009/07/03/powershell-quick-tip-when-you-store-an-array-make-sure-it-is-an-array/ 和这里:https://groups.google.com/forum/#!msg/microsoft.public.windows.powershell/L5J3WffAu9A/vK1mKj2nVncJ

【讨论】:

  • 是不是因为周围的if而“不够”?也就是说,我相信从if 返回“扁平化”单项数组,就像Import-CSV 所做的那样。这意味着您可以在 if 子句中删除周围的 @();他们只是将值装箱以在返回时立即取消装箱。相反,只是像你一样强制一个数组,或者可能包围整个 if -- $a = @(if ($true) { Import-Csv someFile.csv } ...) -- 如果你总是返回一个数组。
猜你喜欢
  • 1970-01-01
  • 2014-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-23
  • 1970-01-01
  • 2021-02-05
  • 1970-01-01
相关资源
最近更新 更多