Выведите значения, которые меньше числа, введенного пользователем - PullRequest
0 голосов
/ 06 декабря 2018

У меня есть файл files.txt, в котором хранятся следующие данные:

1; 400; 33000; садовая кухня

11; 178; 56124; крыша ванной комнаты

7; 777; 20000; одна кухня

10; 150; 1000000; гаражный двор

Мне нужно ввести число и сравнить его с 3-м столбцом каждой строки.Если значение в 3-м столбце меньше, оно печатает строку, в противном случае ничего не делает.

Например, если я читаю число 50000, программа должна вывести:

1; 400; 33000; садовая кухня

7; 777; 20000; кухня на кухне

Вот мой код:

$num = Read-Host "Enter a number"
             $t = Get-content "files.txt" | %{$_.split(";")[2]} 
              for($i = 0; $i -le $t.Length; $i++)
             {
                 if ($num -ge $t[$i])
                 {
                   write-host $t[$i]
                 }
             }

Может ли кто-нибудь помочь?

Ответы [ 3 ]

0 голосов
/ 06 декабря 2018

Сделайте раскол позже.Прямо сейчас вы отбрасываете все остальные колонны.Я также сделал бы foreach:

# making the type int, will validate the input
[int]$num = Read-Host "Enter a number"
$lines = Get-content "files.txt"

foreach($line in $lines) {
    $parts = $line -split ';'

    # make sure we have enough parts
    if($parts.Length -ge 4) {
        # we have enough
        # [int] is not really needed here, but it adds clarity
        if($num -ge [int]$parts[2]) {
            Write-Output $line
        }
    }
}
0 голосов
/ 06 декабря 2018

Я предполагаю, что вы используете PS5.1 +, так как вы не упомянули версию.для этого требуется версия 4+, чтобы использовать .Where() вместо Where-Object.

это НЕ проверяет, что пользовательский ввод является int.если вам это нужно, просто добавьте enuf.[ ухмылка ]

# fake reading in a text file
#    in real life, use Get-Content
$InStuff = @'
1;400;1000000;garden kitchen
11;178;56124;bathroom roof
7;777;20000;oneroom kitchen
10;150;1000000;garage yard
'@ -split [environment]::NewLine

$Choice = Read-Host -Prompt 'Please enter a lower-limit number '

$InStuff.Where({[int]$_.Split(';')[2] -ge [int]$Choice})

вывод ...

Please enter a lower-limit number : 123456
1;400;1000000;garden kitchen
10;150;1000000;garage yard
0 голосов
/ 06 декабря 2018

Я думаю, что было бы проще, если бы вы рассматривали свой файл как CSV и просто импортировали его с пользовательскими заголовками.

$t = Import-Csv files.txt -Delimiter ';' -Header 'Col1','Col2','Col3','Col4'

На данный момент у вас есть объекты для каждой строки, которые будут выглядеть следующим образом:

Col1 : 1
Col2 : 400
Col3 : 33000
Col4 : garden kitchen

Col1 : 11
Col2 : 178
Col3 : 56124
Col4 : bathroom roof

Col1 : 7
Col2 : 777
Col3 : 20000
Col4 : oneroom kitchen

Col1 : 10
Col2 : 150
Col3 : 1000000
Col4 : garage yard

Теперь вы просто запрашиваете число (не забудьте привести его к типу [int], иначе PowerShell будет считать его строкой, а не сравнивать ее как число, когда придет время) и выполнить итерацию $t фильтрация по вашим критериям с оператором Where (и преобразование его обратно в формат, который вы ожидаете, пропуская первую строку, чтобы пропустить настроенные нами заголовки):

[int]$num = Read-Host "Enter a number"
$t|?{$num -gt $_.Col3}|ConvertTo-Csv -del ';' -NoTypeInformation|Select -skip 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...