我有一个名为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]
}
}有人能帮忙吗?
发布于 2018-12-06 00:26:47
过会儿再做分裂。现在你要把其他的列都扔了。我也要做一个预测:
# 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
}
}
}发布于 2018-12-06 00:23:09
我认为,如果您将您的文件作为一个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会认为它是字符串,而不是在时机成熟时将其作为数字进行比较),并使用Where语句迭代$t筛选条件(并将其转换回您所期望的格式,跳过第一行以省略我们设置的标题):
[int]$num = Read-Host "Enter a number"
$t|?{$num -gt $_.Col3}|ConvertTo-Csv -del ';' -NoTypeInformation|Select -skip 1发布于 2018-12-06 00:47:02
我想您使用的是ps5.1+,因为您没有提到版本。这要求版本4+使用.Where()而不是Where-Object。
这并不能验证用户输入是否为int。如果需要的话,添加它很简单。笑一笑
# 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 yardhttps://stackoverflow.com/questions/53642165
复制相似问题