массив powershell, возвращающий неожиданные результаты

#powershell

#powershell

Вопрос:

У меня есть массив объектов, который не возвращает данные, как ожидалось, когда я пытаюсь их отфильтровать.

Данные:

 Date           Batch
----           -----
04/08/2008     1
04/08/2008     2
04/08/2008     3
04/08/2008     10
04/08/2008     11
 

Мой код:

 $table = @{}
$table = import-csv e:report.csv
Foreach($item in $table.GetEnumerator())
{
    If (($item.date -eq '4/8/2008') -and ($item.batch -le 100) )
    {
        $item
    }
}
 

Я ожидал бы, что он вернет все элементы, но я получаю только:

 Date           Batch
----           -----
04/08/2008     1
04/08/2008     10
 

Чего мне не хватает?

Комментарии:

1. При чтении из CSV все значения являются строками. Если вы хотите выполнить числовое сравнение, вам нужны числовые типы. Вы можете просто использовать —> [int]$item.batch -le 100 . Альтернативный вариант — пусть левая часть будет типом данных, который вы хотите —> 100 -ge $item.batch

Ответ №1:

Чего мне не хватает?

Тот факт, что строки не являются числами 🙂

Import-Csv обрабатывает все значения столбцов как строки, поэтому вы сравниваете строку "3" 100 , а не число 3 , и в алфавитном 100 порядке предшествует 3 (первый символ "1" против первого символа "3" ).

Приведение $item.batch к числовому типу:

 foreach($item in Import-Csv E:report.csv)
{
    If (($item.date -eq '4/8/2008') -and ([int]$item.batch -le 100) )
    {                                      # Look, here
        $item
    }
}
 

… или переверните операнды так, чтобы числовое ссылочное значение ( 100 ) было аргументом левой стороны:

 If (($item.date -eq '4/8/2008') -and (100 -gt $item.batch) )
 

Это приведет к тому, что PowerShell преобразует $item.batch в числовой тип перед сравнением

Комментарии:

1. Я знал, что это простая вещь, которую я упускал из виду! Спасибо!