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

时间:2017-08-10 19:25:34

标签: excel powershell export-to-csv powershell-ise

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

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

所以没有什么可以疯狂的,而且它正在运行,但我最终得到一个带有自动生成的H1标头的空列。那么我可以将这两个标签视为通过Excel中的“数据”选项卡导入时的标签吗?或者在Export-Csv期间以某种方式省略空的H1列?

2 个答案:

答案 0 :(得分:3)

不幸的是,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

在此方法中,您可以跳过导入/导出,只需用逗号替换。

(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*,并假设您的其他列都没有以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

答案 1 :(得分:2)

您应该可以在.csv上运行搜索/替换功能(用一个替换两个连续的选项卡,不是吗?)

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