【问题标题】:Extracting columns from text file using PowerShell使用 PowerShell 从文本文件中提取列
【发布时间】:2011-01-30 23:22:39
【问题描述】:

我必须从这篇文章中解释的文本文件中提取列:

Extracting columns from text file using Perl one-liner: similar to Unix cut

但我也必须在没有安装 Perl 的 Windows Server 2008 中执行此操作。我怎么能使用 PowerShell 做到这一点?有什么想法或资源吗?我是 PowerShell 菜鸟...

【问题讨论】:

    标签: powershell windows-server-2008


    【解决方案1】:

    假设这段代码应该用空格分隔。

    $fileName = "someFilePath.txt"
    $columnToGet = 2
    $columns = gc $fileName | 
       %{ $_.Split(" ",[StringSplitOptions]"RemoveEmptyEntries")[$columnToGet] }
    

    【讨论】:

    • 我试过这样 C:> .\Extract_Two_Columns_From_Text_File.ps1 > twocols.dat 但它没有打印任何东西?
    【解决方案2】:

    试试这个:

    Get-Content test.txt | Foreach {($_ -split '\s+',4)[0..2]}
    

    如果您希望将这些列中的数据打印在同一行:

    Get-Content test.txt | Foreach {"$(($_ -split '\s+',4)[0..2])"}
    

    请注意,-split 运算符需要 PowerShell 2.0。此外,,4 告诉拆分运算符您想要的拆分字符串的最大数量,但请记住,最后一个字符串将始终包含所有附加内容。

    对于固定宽度的列,以下是列宽等于 7 ($w=7) 的一种方法:

    $res = Get-Content test.txt | Foreach {
               $i=0;$w=7;$c=0; `
               while($i+$w -lt $_.length -and $c++ -lt 2) {
                   $_.Substring($i,$w);$i=$i+$w-1}}
    

    $res 将包含所有行的每一列。要设置最大列,请将 $c++ -lt 2 从 2 更改为其他值。可能有一个更优雅的解决方案,但现在没有时间去思考它。 :-)

    【讨论】:

    • 谢谢,但这似乎不起作用。我正在运行 PowerShell 2 并尝试从我的固定宽度 .dat 文件(文本文件)中提取前两列
    • 您链接到的剪切示例使用空格分隔符并抓取第 1 到 3 列。如果这不适用于您的情况,您能否说明您的要求是什么?听起来像固定列宽而不是分隔。如果有,列宽是多少?
    • 我的数据在固定宽度的文本文件中(之间有空格)。我修改了你的代码并得到了这个:Get-Content text.txt | Foreach {"$($_.split()[0..2])"}。这让我非常接近,但这会在行之间产生额外的行中断。
    • 确保 $OFS 设置为 $null 或类似 ' '。你也试过 $_ -split '\s+',3 吗?那应该摆脱额外的空条目。 string.split 的工作方式是第一个之后的每个连续空格都会导致返回一个额外的空字符串。
    【解决方案3】:

    普通、

    类型 foo.bar | % { $_.Split(" ") |选择 -first 3 }

    【讨论】:

    • 如果列之间有多个空格(很常见),这将产生一堆空条目。这就是 Jared 使用 [StringSplitOptions]::RemoveEmptyEntries 枚举值的原因。
    • 是的,这会产生相同的结果:Get-Content text.txt | Foreach {"$($_.split()[0..2])"}.
    • 我也试过这个:Get-Content text.txt | Foreach {"$($_.split(" ", [StringSplitOptions]::RemoveEmptyEntries))[0..2])"},但它仍然会产生那些空行。
    • 哦,我明白了。这是? gc R:\test.txt | % { $_ -split '\s+',4 |选择 -f 3 }
    【解决方案4】:

    试试这个。如果您愿意,这将有助于跳过初始行、提取/迭代列、编辑列数据并重建记录:

    $header3 = @("Field_1","Field_2","Field_3","Field_4","Field_5")     
    
    Import-Csv $fileName -Header $header3 -Delimiter "`t" | select -skip 3 | Foreach-Object {
    
        $record = $indexName 
        foreach ($property in $_.PSObject.Properties){
    
            #doSomething $property.Name, $property.Value
    
                if($property.Name -like '*CUSIP*'){
    
                    $record = $record + "," + '"' + $property.Value + '"' 
                }
                else{
                    $record = $record + "," + $property.Value 
                }                           
        }               
    
            $array.add($record) | out-null  
            #write-host $record                         
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-17
      • 1970-01-01
      • 2020-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多