我有一个名为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]
}
}
有人可以帮忙吗?
答案 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会认为它是一个字符串,并且在时间到时不像数字一样进行比较),然后迭代$t
用Where
语句过滤条件(并将其转换回您期望的格式,跳过第一行以省略我们设置的标题):
[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