我希望有人可以帮助我。我在PowerShell中构建了一个函数,用于导入具有两个标题行的分隔文件。我将两个标题行合并为一个并添加下面的数据。这在PowerShell中工作正常:
$Delimiter = ";"
# Load 2nd and 3rd row which contain header informstion
$imData = (Get-Content -Path $csv_file | Select-Object -Skip 1 | select -First 2 ).split($Delimiter)
$columnsCount = $imData.Count/2
# Check if first row header is emtpy, if not, add information to second row
for($i=0; $i -lt $columnsCount;$i++){
if(![string]::IsNullOrEmpty($imData[$i].Substring(1,$imData[$i].Length-2))){
$imData[$i+$columnsCount] = $imData[$i] #.Substring(1,$imData[$i].Length-2)
}
}
$csvData = Get-Content -Path $csv_file | Select-Object -Skip 3
# Remove first row, second row contains header
$imData = $imData[$columnsCount..($imData.Length-1)]
$csvData = $csvData | ConvertFrom-Csv -Delimiter $Delimiter -WarningAction Ignore -Header $imData
最终的$ csvData是正确的,我可以使用它。但是,在PowerShell Core中它不起作用。它从Get-Content命令开始,该命令不会在每列的开头和结尾自动添加。其次,当我在PowerShell Core中调用此代码时,它不会设置标头。实际上,它甚至没有像在PowerShell中那样创建正确的csv对象。在我的核心代码下面:
$delimiter = ";"
#[array]$header = ::new()
# Load 2nd and 3rd row which contain header informstion
[array]$imData = (Get-Content -Path $path | Select-Object -Skip 1 | Select-Object -First 2 ).split($delimiter)
# Set header count
$columnsCount = $imData.Count/2
# Check if first row header is emtpy, if not, add information to second row
for($i=0; $i -lt $columnsCount;$i++){
# Check if column header is empty
if(![string]::IsNullOrEmpty($imData[$i])){
#if(![string]::IsNullOrEmpty($imData[$i].Substring(1,$imData[$i].Length-2))){
$imData[$i+$columnsCount] = $imData[$i] #.Substring(1,$imData[$i].Length-2)
}
}
# Import CSV without header
$csvData = Get-Content -Path $path | Select-Object -Skip 3
# Remove first row, second row contains header
$imData = $imData[$columnsCount..($imData.Length-1)]
# Add header to CSV
$header = ((($imData -split (" " )))) | ConvertFrom-Csv -Delimiter $delimiter
$csvData = $csvData | ConvertFrom-Csv -Delimiter $delimiter -Header $header
$csvData = $header + $csvData
我尝试过不同的方式,但似乎没有什么工作。我希望有人有金头。谢谢斯蒂芬
static [Object] loadCsv([String] $path){
$delimiter = ";"
#[array]$header = ::new()
# Load 2nd and 3rd row which contain header informstion
[array]$csvHeader = (Get-Content -Path $path | Select-Object -Skip 1 | Select-Object -First 2 ).split($delimiter)
# Set header count
$csvColumnsCount = $csvHeader.Count/2
# Check if first row header is emtpy, if not, add information to second row
for($i=0; $i -lt $csvColumnsCount;$i++){
# Check if column header is empty
if(![string]::IsNullOrEmpty($csvHeader[$i])){
#if(![string]::IsNullOrEmpty($imData[$i].Substring(1,$imData[$i].Length-2))){
$csvHeader[$i+$csvColumnsCount] = $csvHeader[$i] #.Substring(1,$imData[$i].Length-2)
}
}
# Remove first row, second row contains header
$csvHeader = $csvHeader[$csvColumnsCount..($csvHeader.Length-1)]
# Import CSV and add header
$csvData = Get-Content -Path $path | Select-Object -Skip 3 | ConvertFrom-Csv -Delimiter $delimiter -Header $csvHeader
return $csvData
}