循环中的条件乘法

时间:2015-05-19 16:00:35

标签: powershell csv

我有一个脚本,它通过一个包含两种数据格式(XY:ZABC0.xyz)的CSV文件。然后将这些值保存在CSV文件中,该文件包含一列和可变行数。我正在尝试设置我的脚本,以便对于值为0.xyz的数字,它将乘以1440,然后将其存储在$Values中。格式XY:ZABC的数量也将存储在$Values中。

$Values = @(Get-Content *\source.csv -Raw) -split '\s+' |
          Where-Object {$_ -like '*:*' -or '0.*'}
"UniqueActiveFaults" | Out-File *\IdealOutput.csv
$Values | Sort-Object -Unique | Out-File *\IdealOutput.csv  

我尝试通过添加以下代码来实现此目的:

foreach ($i in $Values) {
    if ($i -lt 1) {$i*1440} 
}

我还尝试使用do {$i*1440} while ($I -lt 1)循环进行此操作,但结果显示的数字0.xyz显示为1440次。我认为这是由于$Values正在采取的数据类型,但不确定。

示例数据:

0.12345
00:9090 90:4582
0.12346
0.1145
0.145654
0.5648
01:9045 90:4500
90:4546
BA: 1117 BA:2525

2 个答案:

答案 0 :(得分:2)

在您的代码中,$Values是一个字符串数组。字符串上的“乘法”操作是重复它。要像对待数字一样对待它,在乘法之前强制转换为浮动。

foreach ($i in $Values) {
    if ($i -lt 1) {[float]$i * 1440} 
}

正如Tony Hinkle指出的那样,这个循环只会将操作的结果输出到调用者(如果不管道它,则输出控制台)。如果您希望阵列反映更改,则必须将其存储回来。

for ($i = 0; $i -lt $Values.length; $i++) {
    if ($Values[$i] -lt 1) { [float]$Values[$i] *= 1440 }
}

请注意,这会将一些值数组保留为字符串,将某些值保留为浮点数。根据您使用它的方式,您可能需要进行进一步的演员表。

答案 1 :(得分:1)

使用$i*1440时,只是告诉Powershell将这两个值相乘并返回产品。如果要更改$ i的值,则需要使用$i = $1 * 1440

您可能还有其他问题,但这是假设您从输入中获得了分配给$ i的正确值。