Powershell

在 powershell 中讀取 csv 文件,標題行有重複

  • October 24, 2019

我有一個腳本,我正在嘗試讀取一個 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"

引用自:https://serverfault.com/questions/947091