#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. Я знал, что это простая вещь, которую я упускал из виду! Спасибо!