Powershell更改CSV列中没有标题的数据

时间:2018-11-09 22:33:49

标签: powershell

我需要更改没有标题的CSV列。

这是我带头的测试数据:

data.csv:

order|color|shape
1|green|square
1|red|rectangle

这就是我用来将第一列更改为0的原因。

$ImportedCSV = Import-CSV data.csv -Delimiter '|'
$NewCSV = Foreach ($Entry in $ImportedCsv) {
    Switch ($Entry."order") {
        1 {$Entry."order" = "0"}
    }
    $Entry
}
$NewCSV | Export-CSV done.csv -Delimiter '|' -NoTypeInformation

(Get-Content -Path done.csv ).Replace('"','') | Set-Content -Path done.csv

结果是这样的:

order|color|shape
0|green|square
0|red|rectangle

我的data.csv没有标题开头。

“ Switch($ Entry。“ order”)”可以使用列号而不是标题名吗?
那么,类似“第1列”而不是“订单”?

请不要提及仅添加标题,然后在完成后删除标题。
最后,我需要根据列号而不是标题名称来更改列的数据。

那么...用什么代替($ Entry。“ order”)?

($ Entry.Column 1)= nope
($ Entry.Column-1)=不可以

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

假设您拥有:

data_noheader.csv

7|green|square
8|red|rectangle
9|blue|triangle

您想将第一行中的绿色正方形更改为紫色,将col08的项目更改为金色星星。

一些变化:

  1. 使用-Header显式设置标题,以使第一行不被视为标题。
  2. 直接编辑$NewCSV而不是用ForEach进行编辑(这不是必需的,但这会使代码易于遵循和使用)
  3. 不是循环ForEach并查看列名,而是为要由实际行更改的内容显式选择该行。
  4. 对于要基于列的值进行更改的事情,请使用与以前使用的模式相似的模式,然后检查该值。
  5. Select-Object -Skip 1剥离标题
$NewCSV = Import-CSV data_noheader.csv -Delimiter '|' -Header @("col0", "col1", "col2")
$NewCSV[0].col1 = "purple" # Set based on the actual row position
ForEach ($Entry in $NewCSV) {
    If ($Entry.col0 -Eq "8") { # Modify data in other columns in a row based on the value of a particular column
        $Entry.col1 = "gold"
        $Entry.col2 = "star"
    }
}
$NewCSV | Export-CSV done_noheader.csv -Delimiter '|' -NoTypeInformation

(Get-Content -Path done_noheader.csv ).Replace('"','') | Select-Object -Skip 1 | Set-Content -Path done_noheader.csv

done_noheader.csv中的结果现在将是:

7|purple|square
8|gold|star
9|blue|triangle

答案 1 :(得分:0)

如果分隔符是已知且唯一的(不是引用的列数据的一部分)

您可以获取列数

$delim = '|'
$Cols = (get-Content .\data.csv|select -first 1).split($delim).Count

并自动应用编号的页眉

$csv = Import-Csv .\data.csv -Delim $delim -Header @(1..$Cols)

> $csv

1 2      3
- -      -
7 purple square
8 gold   star
9 blue   triangle

操作ForEach中的列

$csv | ForEach-Object { $_.1 = 0 }

> $csv

1 2      3
- -      -
0 purple square
0 gold   star
0 blue   triangle

然后保存,如有必要,请删除引号和标题。