PowerShell - Заголовок в CSV-файле и изменение значения в определенном столбце. - PullRequest
0 голосов
/ 29 мая 2018

Я новичок в Powershell, и я хотел бы получить ответы на несколько моих вопросов.

Что я хочу сделать: у меня есть файл CSV без заголовка (около 30-35 столбцов), и я хотел быхотел бы изменить значение в столбце 20. Я бы заменил это значение на (новое значение = это значение * 5).

Мои проблемы: - это обязательство создать заголовок для моего CSV-файла для доступа к столбцу20 чтобы изменить мое значение?(Если да, как я могу это сделать?) - Как я могу изменить каждую строку моего CSV-файла в colum20 следующим образом: newvalue = column20.value * 5

Спасибо за помощь

Ответы [ 3 ]

0 голосов
/ 29 мая 2018

В демонстрационных целях следующий скрипт

  • сначала создает файл noHeader.csv со случайным количеством столбцов (10..15), строк (5..10) и содержимого.
  • Вторая часть читает в первой строке, разделяет ее на запятую ',', чтобы получить количество столбцов, и создает псевдоголовку H1,H2,...Hx, где x - это число столбцов.
  • Это import-csvфайл и умножает H10 на 5 (приведение к удвоению)

## Q:\Test\2018\05\29\SO_50581599.ps1
$CsvFile = '.\NoHeader.csv'
$NewFile  = '.\WithHeader.csv'
## ======================================================================
## Generate Csv without Header with random no of cols,rows,content
$cols= get-random -min 10 -max 15
$rows= get-random -min 5  -max 10

$Data = ForEach ($Row in (1..$Rows)){
    (1..$Cols | ForEach-Object{Get-Random -min 100 -max 1000} ) -join ','
}
$Data | Out-File $CsvFile
"Generated {0} with {1} columns and {2} rows" -f $CsvFile,$cols,$rows
GC $CsvFile
"=" * 70
## ======================================================================
## evaluate number of columns in file $CsvFile
$ColCnt = ((Get-Content $CsvFile | Select -First 1) -split ',').Count
"File {0} has {1} columns" -f $CsvFile,$ColCnt

## generate Header H1..Hx
$Header = (1..$ColCnt | ForEach-Object{"H{0}" -f $_})

$NewCsv = ForEach($row in (Import-Csv $CsvFile -Header $Header)){
    [double]$row.H10 *= 5
    $row
}
$NewCsv |ft * -auto
$NewCsv | Export-csv $NewFile -NoType

Generated .\NoHeader.csv with 11 columns and 8 rows
591,864,196,281,599,216,152,236,621,311,934
942,222,522,590,649,788,421,665,493,116,282
359,984,645,276,297,320,632,934,296,197,750
746,486,375,756,462,286,977,834,765,828,907
156,899,258,941,222,517,170,301,739,501,414
395,891,182,224,430,773,115,645,114,919,401
743,475,335,650,222,899,690,442,525,695,539
861,341,114,498,550,824,635,407,235,285,631
======================================================================
File .\NoHeader.csv has 11 columns

H1  H2  H3  H4  H5  H6  H7  H8  H9   H10 H11
--  --  --  --  --  --  --  --  --   --- ---
591 864 196 281 599 216 152 236 621 1555 934
942 222 522 590 649 788 421 665 493  580 282
359 984 645 276 297 320 632 934 296  985 750
746 486 375 756 462 286 977 834 765 4140 907
156 899 258 941 222 517 170 301 739 2505 414
395 891 182 224 430 773 115 645 114 4595 401
743 475 335 650 222 899 690 442 525 3475 539
861 341 114 498 550 824 635 407 235 1425 631
0 голосов
/ 02 июня 2018

Наконец я получаю его, как мне хочется:

Использовать Юникод из-за символов ударения

    $FicCSV = "C:\Temp\mycsvfile.csv"
Get-Content $FicCSV | Out-File "C:\Temp\mycsvfile_Unicode.csv" -Encoding Unicode
$csvImport = Import-Csv -path "C:\Temp\mycsvfile_Unicode.csv" -Header "A","B","C","D","E","F","G","H","I","J","K","L1","L2","M","N","O","P","Q","R1","R2","R3","R4","R5","R6","R7","R8","R9","S","T","U","V","W" -delimiter ';'

Десятичное число для выполнения моей математической операции

    foreach ($item in $csvImport){
    [decimal]$item.P= [decimal]$item.P * 5
}

мой файл долженбыть с такими записями: Леа; Джон; Кэти; 10,2; Джордж; ..

$csvImport | ConvertTo-Csv -NoTypeInformation -Delimiter ';' | % {$_.replace('"','').replace(',','.')}| select -Skip 1 | Set-Content "C:\Temp\mycsvfile_back.csv"

Спасибо за EveryOne, кто помог мне добиться успеха:)

0 голосов
/ 29 мая 2018
$csvImport = Import-Csv .\listOfUsers.csv -Header "name","samname","fullname","firstName","lastname","description","company","country","city","multi","targetNum"


foreach ($item in $csvImport){
    [int]$item.targetNum= [int]$item.targetNum * 5
}
$csvImport | ConvertTo-Csv -NoTypeInformation | select -Skip 1 | Set-Content .\listOfUsers.csv

Я выбрал 11-й столбец, но он должен работать и для 20-го столбца.

...