【问题标题】:PowerShell - Header in CSV file and modify a value in a specific columnPowerShell - CSV 文件中的标题并修改特定列中的值
【发布时间】:2018-05-29 10:04:27
【问题描述】:

我是 Powershell 的新手,我想回答我的几个问题。

我想做的事: 我有一个没有标题的 CSV 文件(大约 30-35 列),我想修改第 20 列中的值。我将用 (newvalue = this value*5) 替换这个值。

我的问题: - 是否有义务为我的 CSV 文件创建标题以在第 20 列访问以修改我的值? (如果是,怎么能这样做??) - 我如何修改colum20中我的CSV文件的每一行: 新值 = column20.value * 5

感谢帮助

【问题讨论】:

  • Dany,很高兴让您的单个问题更具体,否则看起来您要求得到有效的辅导,而本网站没有这样做。我建议获得一些帮助,提出一个特定的编码问题,以及您当前尝试过的代码的编码块以及该代码的结果。即使你正在学习,也很高兴展示你所拥有的,并从那里寻求帮助。
  • 感谢 Cam_Aust 你的话。实际上,我尝试了一些代码,但它太乱了,所以我什么也没放:)
  • 好的,看来您至少有一个答案。那很好。欢迎来到 SO。

标签: powershell csv header arithmetic-expressions


【解决方案1】:
$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 列。

【讨论】:

  • Thx Ketanbhut,我要试试这个,我没有尝试这个 :) 我可以看到,必须将标题名称放在我的很多列中......谢谢你的光
  • 如果您愿意,您可以保留任何标题名称,如果它们将来对您没有用处。像 header1, header2....header20 一样,你还是要在最后一行删除它。
  • Ketanbhut,我尝试了您的代码,但遇到了 2 个问题。我可以解决一个问题:我在 Import-csv 之前放置了一个 Get-content(用于 unicode 编码)。但我不知道如何处理我的数据。我想要这样的东西:lilou;125;eric;45 但这里我有 "lilou,"125","eric","45" ...为什么???
  • 没关系,我明白了!!!我的一段代码:$csvImport | ConvertTo-Csv -NoTypeInformation -Delimiter ';' | % {$_ -replace '"',''}| 选择 -Skip 1 | Set-Content .\listOfUsers.csv
【解决方案2】:

出于演示目的,以下脚本

  • 首先生成一个列数随机的文件noHeader.csv (10..15)、行(5..10) 和内容。
  • 第二部分读取第一行,将其拆分为 ',' 逗号 获取列数并构建一个伪 Header 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

【讨论】:

  • Thx LotPings,我正在寻找这种代码,因为我有超过 30 列。
  • 代码适用于任意数量的列,我只是减少列以适应输出而不滚动。
【解决方案3】:

终于如愿以偿:

由于重音字符而使用 Unicode

    $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
}

我的文件必须包含这样的记录:lea;john;katy;10.2;george;..

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

感谢每个帮助我成功的人 :)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-22
    • 1970-01-01
    • 2013-10-14
    • 2022-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-09
    相关资源
    最近更新 更多