在Powershell中处理.csv文件中的重复标头

时间:2013-09-17 22:12:45

标签: powershell csv

我正在尝试使用PS脚本尝试自动执行部分流程,其中可以将一个部门系统的导出导入另一个部门系统。我需要使用多个“;”行分离的电子邮件地址并将它们分成单独的行,每行包含1个地址,同时保留其余数据。我有一个解决方案,主要是工作,它依赖于Import-CSV。

我遇到的问题是我得到的导出有多行具有相同的列标题。这导致Powershell给我错误“会员”结束“已经存在”。 (其中“end”是多个列上的标题)。

当有重复的列标题时,就会运行“import-csv ./addresses.csv”,所以我正在运行import-csv命令本身,我认为,对于我可能正在使用脚本做的任何奇怪的事情。

编辑csv以更改其中一个列名称会修复此问题,但该要求会使该过程自动化变得很困难。

PowerShell有没有办法处理具有重复列名的CSV?我宁愿避免在包含电子邮件地址的列名之外指定列名,因为它们似乎会定期更改。如果我可以保留他们正在使用的列名称,那将是最好的。

3 个答案:

答案 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