是否可以使用 Import-Csv 将连续的分隔符视为一个分隔符?

Is it possible to treat consecutive delimiters as one using Import-Csv?

我有一些包含双标签栏的 txt 格式的日志文件。 我正在使用以下 PowerShell:

Import-Csv C:\path\to\file\PageLog.txt -Delimiter "`t" | Export-Csv C:\path\to\file\PageLog.csv -NoTypeInformation

所以没有什么疯狂的,它正在工作,但我最终得到一个空列,其中包含一个自动生成的 H1 header。那么我在通过 Excel 中的 "Data" 选项卡导入时是否可以将这两个选项卡视为一个选项卡?或者在 Export-Csv?

期间以某种方式省略空的 H1 列

您应该能够 运行 .csv 上的 search/replace 函数(将两个连续的制表符替换为一个,不是吗?)

我不知道 Import-Csv 是否允许 -replace,但如果不允许,您可以将 .csv 文件转换为字符串(参见 Powershell Converting .csv format (Import-csv) to string),运行 -replace,然后将其转换回 .csv。

不幸的是,对于 Import-CSV,分隔符的长度只能是一个字符。这给您留下了两个选择。第一种是在文件上使用字符串解析以得到一个定界符。

(Get-Content C:\path\to\file\PageLog.txt) -replace "`t`t","`t" | Out-File C:\path\to\file\PageLog.temp.txt
Import-Csv C:\path\to\file\PageLog.temp.txt -Delimiter "`t" | Export-Csv C:\path\to\file\PageLog.csv -NoTypeInformation

在此方法中,您可以跳过 import/export,只需用逗号替换即可。

(Get-Content C:\path\to\file\PageLog.txt) -replace "`t`t",',' | Out-File C:\path\to\file\PageLog.temp.txt

否则您可以导入带有额外列和过滤器的 csv。正如 iRon 所建议的,如果你只有一个额外的列,你可以简单地排除它:

Import-Csv C:\path\to\file\PageLog.txt -Delimiter "`t" |
    Select-Object * -ExcludeProperty H1 |
    Export-Csv C:\path\to\file\PageLog.csv -NoTypeInformation

如果您有多个,Select-Object 支持通配符,因此您可以使用 -ExcludeProperty H* 并假设其他列中的 none 以 H 开头。

否则你可以对列名使用正则表达式。

$CSV = Import-Csv C:\path\to\file\PageLog.txt -Delimiter "`t"
$GoodColumns = $CSV |
    Get-Member -MemberType NoteProperty |
    Where-Object {$_.name -notmatch '^H\d+$'} |
    Select-Object -ExpandProperty Name
$CSV | Select-Object $GoodColumns | Export-Csv C:\path\to\file\PageLog.csv -NoTypeInformation