У меня есть сценарий, с помощью которого я пытаюсь прочитать файл csv и присвоить данным имена столбцов. однако файлы имеют несколько столбцов с одинаковыми именами, см. ниже Оценка качества / контроля качества и символ
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
вот код ниже, как я могу изменить его, чтобы, возможно, вырезать строку заголовка и заменить имена моих столбцов?
$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
}
Основываясь на комментарии "lotpings", я написал функцию, которая проверяет, нет ли в CSV двойников. Это также гарантирует, что цитаты из заголовков удалены.
использовать как:
csv_header_numbering_when_doublefound("dir/myfile.csv");
function csv_header_numbering_when_doublefound($fname)
{
$file=Get-Content "$fname"
($file | Select-Object -First 1) -split ',' |
ForEach-Object {$Header = @{};$i=0}{
$key = $_ -replace '"',''
$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 > $fname;
$file | select-object -skip 1 >> $fname
}
Вы не можете импортировать повторяющиеся заголовки,
поэтому игнорируйте их и укажите свои собственные новые имена заголовков.
Get-Content
вместо того Import-Object
-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://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/import-csv?view=powershell-6. Последний столбец будет
$station[10]