【发布时间】:2021-10-14 19:01:24
【问题描述】:
我有一个文本文件,它基本上是两列 n 行。
列由双空格分隔 - powershells import-csv cmdlet 仅允许使用单个字符分隔符。
我最好的解决方法是什么,因为我的目标是将我的第一列变成一个变量。
【问题讨论】:
-
请edit您的问题添加示例,说明您的文件是什么样的,以及您希望最终结果是什么。
标签: powershell
我有一个文本文件,它基本上是两列 n 行。
列由双空格分隔 - powershells import-csv cmdlet 仅允许使用单个字符分隔符。
我最好的解决方法是什么,因为我的目标是将我的第一列变成一个变量。
【问题讨论】:
标签: powershell
如果您当前的分隔符仅作为分隔符出现,一种简单的方法是选择文件中任何地方都不存在的新分隔符。如果我们选择;,您可以执行以下操作:
$content = (Get-Content file.csv) -replace ' ',';' |
ConvertFrom-Csv -Delimiter ';'
# outputs column1 values
$content.column1
如果您不能保证您的分隔符不会出现在文件中,您将需要限定当前文本(通常使用双引号),以防止该字符被错误地指责为分隔符。仅当您的数据不合格时才需要这样做。
$content = (Get-Content file.csv) -replace '(?=")|^|$|(?<= )|(?= )','"' -replace ' ',';' |
ConvertFrom-Csv -Delimiter ';'
如果您的数据已经合格,那么您只需替换它作为分隔符出现的双倍空格。但您也需要注意作为数据出现的限定字符。
$content = (Get-Content file.csv) -replace '(?<!^|" )"(?!$| ")','""' -replace '(?<=") (?=")',';' |
ConvertFrom-Csv -Delimiter ';'
我确信可以为上述任何方法创建异常。您将需要了解您的数据并提出验证检查以验证您的数据架构。
【讨论】:
AdminOfThings' helpful answer 为解析所有列提供了良好的通用指针和通用解决方案。
回复:
将我的第一列放入变量中
# Create a sample file.
@'
foo ...
one two ...
more ...
'@ > sample.txt
# Extract the first column.
$col1Values = (Get-Content sample.txt) -replace ' .*$'
输出$col1Values 产量:
foo
one two
more
注意:如果第一列的值是双引号(并且不包含嵌入的、转义的双引号),请附加-replace '"'(或(...).Trim('"'))
【讨论】:
如果值不包含空格或包含空格,为什么不直接Import-Csv -Delimiter ' ' 并忽略第二列:
PS C:\> @'
>> Header1 Header2
>> Data11 Data12
>> "Data 2 1" "Data 2 2"
>> '@ | ConvertFrom-Csv -Delimiter ' '
WARNING: One or more headers were not specified. Default names
starting with "H" have been used in place of any missing headers.
Header1 H1 Header2
------- -- -------
Data11 Data12
Data 2 1 Data 2 2
要仅获取第一列,您可以将表达式放在括号中并使用点表示法:
PS C:\>>( @'
>> Header1 Header2
>> Data11 Data12
>> "Data 2 1" "Data 2 2"
>> '@ | ConvertFrom-Csv -Delimiter ' ' ).Header1
WARNING: One or more headers were not specified. Default names
starting with "H" have been used in place of any missing headers.
Data11
Data 2 1
因此,假设您有一个由双空格分隔的纯文本数据文件,您可以将第一列的值放入一个变量中,如下所示:
$MyFile = 'c:\MyFile.txt'
$Column1Values = ( $MyFile | Import-Csv -Delimiter ' ' ).Header1
【讨论】: