Попытка умножить на 100 или 100 каждую строку и столбец в CSV с помощью PowerShell - PullRequest
2 голосов
/ 29 мая 2020

Вот пример файла .txt с разделителями табуляции в начале:

CH00-03 CH00-04 CH00-06 CH00-07 CH00-08
°F  °F  °F  °F  °F
1.1120e+002  1.0040e+002     4.0208e+002     4.4312e+002     4.5428e+002
2.3378e+002  2.3810e+002     2.4386e+002     2.5376e+002     4.1126e+002
2.6726e+002  2.5970e+002     2.5790e+002     2.5880e+002     2.6294e+002
-5.8662e+003    -5.8662e+003    -5.8662e+003    -5.8662e+003    -5.8662e+003

Я запускаю этот код, чтобы изменить его на CSV, удалив E +:

$DataPath = 'C:\Test'
$DataName = '\*.txt'
$DataTemp = '\Tempfile.csv'
$NewData = '\Complete.csv'

$DataStream = $DataPath + $DataName
$TempStream = $Datapath + $DataTemp
$NewStream = $DataPath + $NewData
#$DataContent = $DataName

$DataContent = Get-Content -Path  "$DataStream" -Raw

$Data1 = $DataContent -replace '[E+]','' 
$Data2 = $Data1 #Required as for some reason no data comes out if not passed through another variable.
ECHO $Data2 > $TempStream 

IMPORT-CSV -Delimiter "`t" -Header ('Column1','Column2','Column3','Column4','Column5')  -Path $TempStream | Export-Csv $NewStream -NoType

, то я брал данные из $ NewStream, чтобы умножить их на 100 или 1000 в зависимости от последнего di git после удаления E +

в тот момент, когда я пытаюсь заставить умножение работать, прежде чем выбирать на что следует умножать, вот несколько ошибок проб и ошибок:

  1. тест для разделения данных и цифр.
$import = get-content $NewStream
$import | select -First 3 | Set-Content $Header
$import | Select-Object -Skip 3 | Set-Content $CSVOUT
$NewImport = Get-Content $CSVOUT
пробовал, не уверен, близко это или нет.
$NewStream | foreach-object {$_ * 100} | Set-Content "C:\Test\Testing6.csv"
пробовал это, однако я чувствую, что это не может работать с тем, что у меня по какой-то причине
$arr = $DataContent
for($i = 0; $i -lt $arr.Length; $i++){
   $arr[$i] = $arr[$i] * 100
}
ECHO $arr > "C:\Test\Testing6.csv"

также пробовал с этим

$arr = $DataContent2
for($i = 0; $i -lt $arr.Length; $i++){
   $arr[$i] = [float]$arr[$i] *= 100
ECHO $arr > "C:\Test\Testing6.csv"
}

$ NewStream выглядит так:

Column1,Column2,Column3,Column4,Column5
CH00-03,CH00-04,CH00-06,CH00-07,CH00-08
°F,°F,°F,°F,°F
1.1120002,1.0040002,4.0208002,4.4312002,4.5428002
2.3378002,2.3810002,2.4386002,2.5376002,4.1126002
2.6726002,2.5970002,2.5790002,2.5880002,2.6294002
-5.8662003,-5.8662003,-5.8662003,-5.8662003,-5.8662003

Я пытаюсь умножить все это на 100 или 1000 на основе последнего числа на число, но просто всегда сталкиваюсь с разными ошибками, независимо от того, что я пытаюсь.

Думаю, я сделал это намного сложнее, чем нужно, пожалуйста, помогите, если бы это все работало правильно. Я также открыт для других windows языков программирования:)

РЕДАКТИРОВАТЬ: Спасибо, Матиас, ты получил мне все остальное, что мне нужно для завершения sh сценария. Кажется, что "t" не работает, однако, как показано ниже, я нашел способ поработать с ним.

Вот конечный результат, который у меня работает:

#Setup to easily change Data Path.
$DataPath = 'C:\Test'
$DataName = '\*.txt'
$DataTemp = '\Tempfile.csv'
$NewData = '\Complete.csv'
$FinalData = '\Final.csv'

#Path Concatenation.
$DataStream = $DataPath + $DataName
$TempStream = $Datapath + $DataTemp
$NewStream = $DataPath + $NewData
$OUTCSV = $DataPath + $FinalData

#Getting Content
$DataContent1 = Get-Content -Path  "$DataStream" -Raw

#Because Get-Content does not work when introduced into IMPORT-CSV directly as a variable it needs a file changed to csv.  all other ways would give me dupe header errors.
$DataContent1 > $TempStream

#Because "`t" does not work in Convertfrom-csv or Convertto-csv.  Also because of Dupe header errors, this helps the most in eliminating them.

IMPORT-CSV -Delimiter "`t" -Header ('Column1','Column2','Column3',
'Column4','Column5','Column6','Column7','Column8','Column9','Column10',
'Column11','Column12','Column13','Column14','Column15','Column16',
'Column17','Column18','Column19','Column20','Column21','Column22',
'Column23','Column24','Column25','Column26','Column27','Column28',
'Column29','Column30')  -Path $TempStream | Export-Csv $NewStream -NoType

#Grabbing the new content.
$DataContent2 = Get-Content -Path  "$NewStream" -Raw

#This is the Scientific Notation conversion to Decimal.
$DataContent2 = [regex]::Replace($DataContent2, '(-?\d+\.\d+e\+\d+)', {param($m) $m.Value -as [double]})

#This creates the File I needed:) 
$DataContent2|ConvertFrom-Csv -delimiter ","|Export-Csv -Path $OUTCSV -NoTypeInformation

#To delete the CSV files used to build the Final CSV

DEL $TempStream
DEL $NewStream

1 Ответ

3 голосов
/ 29 мая 2020

Вам не нужно анализировать эти числа вручную, PowerShell поддерживает научную c нотацию!

PS C:\> '4.0208e+002' -as [double]
402.08

Итак, все, что вам нужно сделать, это преобразовать значения в числовой тип! Вы можете использовать метод Regex.Replace() для передачи блока сценария, который преобразует числа в научную c нотацию следующим образом:

$DataContent = Get-Content -Path  "$DataStream" -Raw

$DataContent = [regex]::Replace($DataContent, '(-?\d+\.\d+e\+\d+)', {param($m) $m.Value -as [double]})

$DataContent теперь будет выглядеть следующим образом для опубликованного вами образца ввода:

CH00-03 CH00-04 CH00-06 CH00-07 CH00-08
°F  °F  °F  °F  °F
111.2   100.4     402.08     443.12     454.28
233.78  238.1     243.86     253.76     411.26
267.26  259.7     257.9     258.8     262.94
-5866.2    -5866.2    -5866.2    -5866.2    -5866.2

Теперь просто конвертируйте из TSV в объекты и снова экспортируйте в CSV с разделителем по умолчанию, и у вас есть нужный вам формат:

$DataContent |ConvertFrom-Csv -Delimiter "`t" |Export-Csv -Path $OUTCSV -NoTypeInformation
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...