2015-05-19 4 views
0

У меня есть сценарий, который проходит через CSV-файл с двумя форматами данных (XY:ZABC или 0.xyz). Значения затем сохраняются в 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

Можете ли вы добавить пример ваших данных csv, пожалуйста, – Paul

+0

@Paul, я добавил образцы данных в исходное сообщение –

ответ

1

При использовании $i*1440, что просто говорит Powershell перемножить два значения и возврата продукта. Если вы хотите изменить значение $ i, вам нужно использовать $i = $1 * 1440.

У вас могут быть и другие проблемы, но предполагается, что вы получаете правильные значения, присвоенные $ i от ввода.

2

В вашем коде $Values представляет собой массив строк. Операция «умножить» на строке - это повторить ее. Чтобы обрабатывать его как число, бросать в float перед умножением.

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

Как Тони Хинклем отметил, этот цикл будет просто выводить результат операции к абоненту (или консоли, если вы не конвейеру). Если вы хотите, чтобы ваш массив отражал изменение, вам нужно его вернуть.

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

Знайте, что это оставит некоторые из ваших значений массивом в виде строк, а некоторые - как плавающие. В зависимости от того, что вы делаете с ним, вам, возможно, придется делать другие броски.

+0

спасибо. Это отлично работает. У меня есть два вопроса: (a) Не могли бы вы объяснить ваш второй фрагмент кода, я не уверен, что понимаю использование $ Values.length и условное действие if во второй строке. (b) Кроме того, вывод моего цикла дает мне действительное число, но также возвращает дополнительный 0 (ноль) каждый раз. Любая идея, откуда этот ноль? –

+0

'for' во втором бите - синтаксис альтернативного цикла, где' $ i' - числовой индекс в массиве и от 0 до длины массива. Это необходимо, потому что 'foreach' не дает доступ к исходному массиву для его изменения. Что касается дополнительного 0, вам придется вставить свой код, возможно, в новый вопрос. –

Смежные вопросы