我需要更改没有标题的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)=不可以
感谢您的帮助。
答案 0 :(得分:1)
假设您拥有:
data_noheader.csv
7|green|square
8|red|rectangle
9|blue|triangle
您想将第一行中的绿色正方形更改为紫色,将col0
为8
的项目更改为金色星星。
一些变化:
-Header
显式设置标题,以使第一行不被视为标题。$NewCSV
而不是用ForEach
进行编辑(这不是必需的,但这会使代码易于遵循和使用)ForEach
并查看列名,而是为要由实际行更改的内容显式选择该行。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
然后保存,如有必要,请删除引号和标题。