Powershell: неверное возвращение как наибольшее значение - PullRequest
0 голосов
/ 04 июня 2018

Я использую Powershell для разбора файла CSV.Файл CSV представляет собой перечень игр, включая их название, жанр и цену.Сценарий предназначен для выполнения базовых запросов на вывод файла;это мое типичное упражнение, которое я использую для тренировки ввода / вывода файлов с новыми языками.Один из моих запросов возвращает неожиданный вывод.

входной файл:

Name,Genre,Price
Age_of_Empires,RTS,19.99
Europa_Universalis_IV,GS,129.99
Skyrim,RPG,60.00
Oblivion,RPG,30.00
Morrowind,RPG,10.00
Call_of_Duty,FPS,60.00
Knights_and_Merchants,RTS,5.00
Halo,FPS,60.00
Empire_Earth,RTS,10.00
Civilization,GS,59.99
Empires_Apart,RTS,10.00
Battlefield,FPS,59.99
Paper_Mario,RPG,2.99
Victoria_II,GS,9.99
Cultures,RPG,7.99
PUBG,FPS,79.99
Crusader_Kings,GS,9.99

А вот мой сценарий:

#Parses data file
#Format: [Name],[Genre],[Price]
$file = Import-Csv .\inventory
echo ""
echo "Welcome to `"GameGO`"! here is our current inventory..."
echo $file #Print out the inventory
Read-Host "Press Enter to continue" #This is only here because it keeps the program from running out of order
do #Use a loop to ask if the user wants to inquire many items
{
    $choice = Read-Host "What would you like to inquiry?"
    #The following blocks of if statements will be used to determine what output to give. Note that the user 
    #will have to know verbatim what commands to give 
    if ($choice -eq "average")
    {
        #Removed for simplicity on Stack Overflow
    }
    elseif ($choice -eq "highest")
    {
        $high = 0          #To be safe?
        $highGame = "null" #Do I have to initalize this to a value?
        ForEach ($line In $file)
        {
            if ($line.Price -gt $high)
            {
                $highGame = $line.Name
                $high = $line.Price
                echo "The new most expensive game is $highGame and it costs $high." #Debug statement!
            }
        }
        echo "The final most expensive game is $highGame and it costs $high." 
    }
    $loop = Read-Host "Would you like to inquire something else? Y\N"
} while ($loop = "Y")

Мой оператор if, который проверяет на самый высокийценная игра дает неверное значение.Возвращаемое неверное значение соответствует, но без какого-либо шаблона, который я могу распознать.

Как сейчас стоит программа:

What would you like to inquiry?: highest
The new most expensive game is Age_of_Empires and it costs 19.99.
The new most expensive game is Skyrim and it costs 60.00.
The new most expensive game is Victoria_II and it costs 9.99.
The final most expensive game is Victoria_II and it costs 9.99.

Я попытался изменить цены вокруг, удалить названия, добавивновые, переупорядочивание и т. д. Но ни один отладочный тест не может привести к тому, что я действительно смогу увидеть, где моя ошибка.Кажется, нет никаких оснований для этого.Мне нужна еще пара глаз на это.

Кроме того, у меня странная ошибка, когда команды Read-Host приводят к тому, что строки сценария не работают.Как ни странно, это решается добавлением Read-Host «Нажмите Enter для продолжения».Я не беспокоюсь об этом сейчас, я только включаю это объяснение, чтобы помочь вам понять, почему эта строка включена.

1 Ответ

0 голосов
/ 04 июня 2018

В этом случае цена хранится в виде строки в объекте csv.Просто приведите его к целому или двойному числу, и ваш код работает нормально!

if ([double]$line.Price -gt $high)

В основном это работало в алфавитном порядке, поэтому вы начинаете с 1, затем 6, а затем 9. Например, он пропускает Oblivion, потому что 6 находится «дальше вниз» по алфавитному списку, чем 3.

Надеюсь, это поможет объяснить проблему - это довольно интуитивно понятно, когда вы видите проблему.Кстати, Рувим - лучший бутерброд.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...