我正在尝试使用PS脚本尝试自动执行部分流程,其中可以将一个部门系统的导出导入另一个部门系统。我需要使用多个“;”行分离的电子邮件地址并将它们分成单独的行,每行包含1个地址,同时保留其余数据。我有一个解决方案,主要是工作,它依赖于Import-CSV。
我遇到的问题是我得到的导出有多行具有相同的列标题。这导致Powershell给我错误“会员”结束“已经存在”。 (其中“end”是多个列上的标题)。
当有重复的列标题时,就会运行“import-csv ./addresses.csv”,所以我正在运行import-csv命令本身,我认为,对于我可能正在使用脚本做的任何奇怪的事情。
编辑csv以更改其中一个列名称会修复此问题,但该要求会使该过程自动化变得很困难。
PowerShell有没有办法处理具有重复列名的CSV?我宁愿避免在包含电子邮件地址的列名之外指定列名,因为它们似乎会定期更改。如果我可以保留他们正在使用的列名称,那将是最好的。
答案 0 :(得分:4)
我知道这是一篇旧帖子,但认为其他人可能正在寻找一个更好的解决方案。
我需要动态更正重复的标头。并且不知道我要导入的任何文件之前的字段会带来一些重大挑战。
这就是我所做的:
# Use System.IO.StreamReader to get the first line. Much faster than Get-Content.
$StreamReader = New-Object System.IO.StreamReader -Arg $csvTemp
# Parse the first line with whatever delimiter you expect. Trim + Remove Empty columns.
# Comment out the last part if you want to generate headers for those who are empty.
[array]$Headers = $StreamReader.ReadLine() -Split "," | % { "$_".Trim() } | ? { $_ }
# Close the StreamReader, as the file will stay locked.
$StreamReader.Close()
# For each Header column
For ($i=0; $i -lt $Headers.Count; $i++) {
if ($i -eq 0) { Continue } #Skip first column.
# If in any previous column, give it a generic header name
if ($Headers[0..($i-1)] -contains $Headers[$i]) {
$Headers[$i] = "Header$i"
}
}
# Import CSV with the new headers
Import-Csv $csvTemp -Header $Headers
答案 1 :(得分:1)
如果你知道你的列数据将提前是什么,那么只需指定自己的标题名称,这将忽略文件中的标题行。
Import-CSV -Header header1, header2, header3 addresses.csv
答案 2 :(得分:0)
使用System.IO.StreamReader
获取第一行。比Get-Content
快得多。
$StreamReader = New-Object System.IO.StreamReader -Arg $csvTemp
使用您期望的任何分隔符解析第一行。修剪+删除空列。 如果您想为那些空的人生成标题,请注释掉最后一部分。
[array]$Headers = $StreamReader.ReadLine() -Split "," | % { "$_".Trim() } | ? { $_ }
关闭StreamReader,因为文件将保持锁定状态。
$StreamReader.Close()
对于每个标题栏
For ($i=0; $i -lt $Headers.Count; $i++) {
if ($i -eq 0) { Continue } #Skip first column.
# If in any previous column, give it a generic header name
if ($Headers[0..($i-1)] -contains $Headers[$i]) {
$Headers[$i] = "Header$i"
}
}
使用新标题导入CSV
Import-Csv $csvTemp -Header $Headers
这是对字母而不是标题的反击 每个字母出现的例子" E"它放置header1,header2