Powershell
在 powershell 中讀取 csv 文件,標題行有重複
我有一個腳本,我正在嘗試讀取一個 csv 文件並將列名分配給數據。但是這些文件有多個名稱相同的列,請參見下面的 QA/QC 等級和符號
ID,Date,Water Level / Niveau d'eau (m),Grade,Symbol / Symbole,QA/QC,Discharge / Débit (cms),Grade,Symbol / Symbole,QA/QC 07QC008,2018-12-28T00:00:00-06:00,6.536,,,1,0.052,,,1
這是下面的程式碼,我該如何修改它以刪除標題行並替換我的 ow 列名稱?
$stations = import-csv “C:\Users\robm\Downloads\stations\SK_hourly_hydrometric.csv” #$stations | Get-Member ForEach ($station in $stations){ $ID = $($station.ID) $Date = $($station.Date) $WaterLevel = $($station."Water Level / Niveau d'eau (m)") $GradeWL = $($station.Grade1) $SymbolWL=$($station."Symbol / Symbole1") $QAWL=$($station."QA/QC1") #$Discharge=$($station."Discharge / Débit (cms)") $Discharge=$($station."Discharge") $GradeD=$($station.Grade2) $SymbolG=$($station."Symbol / Symbole2") $QAD=$($station."QA/QC2") Write-host $ID "|" $Date "|" $WaterLevel "|" $GradeWL "|" $SymbolWL "|" $QAWL "|" $Discharge "|" $GradeD "|" $SymbolG "|" $QAD #Write-host $Discharge }
您不能使用重複的標頭導入,
因此請忽略它們並提供您自己的新標頭名稱。
- 使用
Get-Content
而不是Import-Object
- 跳過第一行
- 將 ConvertFrom-Csv 與您的標題一起使用
- (取消)選擇輸出中不需要的列
- 使用 export-csv
-Delimiter '|'
來獲得一個新的正確 csv(所有標題/列雙引號)
## Q:\Test\2018\12\31\sf_947091.ps1 $FileIn = 'C:\Users\robm\Downloads\stations\SK_hourly_hydrometric.csv' $FileOut= 'C:\Users\robm\Downloads\stations\SK_hourly_hydrometric_new.csv' $stations = Get-Content $FileIn | Select-Object -Skip 1 | ConvertFrom-Csv -Header ID,Date,WaterLevel,GradeWL,SymbolWL,QAWL,Discharge,GradeD,SymbolG,QAD $stations | Select-Object -Exclude Discharge $stations | Select-Object -Exclude Discharge | Export-Csv $FileOut -NoTypeInformation
範例輸出到螢幕:
ID : 07QC008 Date : 2018-12-28T00:00:00-06:00 WaterLevel : 6.536 GradeWL : SymbolWL : QAWL : 1 Discharge : 0.052 GradeD : SymbolG : QAD : 1
範例 $FileOut
> Get-Content $FileOut "ID"|"Date"|"WaterLevel"|"GradeWL"|"SymbolWL"|"QAWL"|"Discharge"|"GradeD"|"SymbolG"|"QAD" "07QC008"|"2018-12-28T00:00:00-06:00"|"6.536"|""|""|"1"|"0.052"|""|""|"1"
一種完全不同的方法是自動讀取舊的標頭,
儲存在雜湊表中,
從而檢查重複項並附加越來越多的數字
## Q:\Test\2018\12\31\sf_947091_".ps1 $FileIn = 'C:\Users\robm\Downloads\stations\SK_hourly_hydrometric.csv' (Get-Content $FileIn | Select-Object -First 1) -split ',' | ForEach-Object {$Header = @{};$i=0}{ $key = $_ $j = 1 while ($Header.Containskey($key)){ $key = ("{0}{1}" -f $_,++$j) } $Header.Add($key,++$i) } $NewHeader = ($Header.GetEnumerator()|Sort-Object Value| ForEach-Object {'"'+$_.Name+'"'}) -Join ',' $NewHeader
"ID","Date","Water Level / Niveau d'eau (m)","Grade","Symbol / Symbole","QA/QC","Discharge / D‚bit (cms)","Grade2","Symbol / Symbole2","QA/QC2"