是否可以使用 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
我有一些包含双标签栏的 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