打印小于用户输入数字的值

时间:2018-12-05 23:06:31

标签: powershell sorting

我有一个名为files.txt的文件,其中包含以下数据:

1; 400; 33000;花园厨房

11; 178; 56124;浴室屋顶

7; 777; 20000;一室厨房

10; 150; 1000000;车库

我需要输入一个数字,并将其与每行的第三列进行比较。如果第三列中的值较小,则会打印出该行,否则将不执行任何操作。

例如,如果我输入数字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 :(得分:3)

我认为,如果您将文件视为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会认为它是一个字符串,并且在时间到时不像数字一样进行比较),然后迭代$tWhere语句过滤条件(并将其转换回您期望的格式,跳过第一行以省略我们设置的标题):

[int]$num = Read-Host "Enter a number"
$t|?{$num -gt $_.Col3}|ConvertTo-Csv -del ';' -NoTypeInformation|Select -skip 1

答案 1 :(得分:1)

稍后进行拆分。现在,您正在扔掉所有其他列。我也会做一个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
        }
    }
}

答案 2 :(得分:1)

我假设您使用的是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