【问题标题】:powershell txt file delimited by " " to csv以“”分隔的powershell txt文件到csv
【发布时间】:2021-10-14 19:01:24
【问题描述】:

我有一个文本文件,它基本上是两列 n 行。

列由双空格分隔 - powershells import-csv cmdlet 仅允许使用单个字符分隔符。

我最好的解决方法是什么,因为我的目标是将我的第一列变成一个变量。

【问题讨论】:

  • edit您的问题添加示例,说明您的文件是什么样的,以及您希望最终结果是什么。

标签: powershell


【解决方案1】:

如果您当前的分隔符仅作为分隔符出现,一种简单的方法是选择文件中任何地方都不存在的新分隔符。如果我们选择;,您可以执行以下操作:

$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 ';'

我确信可以为上述任何方法创建异常。您将需要了解您的数据并提出验证检查以验证您的数据架构。

【讨论】:

    【解决方案2】:

    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('"')

    【讨论】:

      【解决方案3】:

      如果值不包含空格或包含空格,为什么不直接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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-01-28
        • 2011-12-12
        • 1970-01-01
        • 2021-12-17
        • 1970-01-01
        • 1970-01-01
        • 2019-09-26
        相关资源
        最近更新 更多