【问题标题】:PowerShell - Import Text File and FilterPowerShell - 导入文本文件和过滤器
【发布时间】:2020-02-20 04:49:30
【问题描述】:

要求: 导入大型制表符分隔的文本文件,从 3.5 到 550 万行不等。 仅将匹配的行导出到单独的文件中。

文件内容(行尾也有标签):

Id  TypeId  SField  File    ADate   AField  CField  Status  RDate   Rec FiId    CRec
15773363    2614    ZZ  HL3 07/06/12    3271.75 3050.00 PPP 11/23/12    698         
25073163    3215    ZZ  TDU 12/04/17    1204.56     CCR     716     P304    
25259159    3215    ZZ  TDU 01/04/18    539.44      CCR     649     P303    
25677650    3259    ZZ  TDU 03/03/18    872.06      CCR     653     P101    
26096141    3259    ZZ  TDU 05/03/18    880.61      CCR     647     P201    
26282137    3215    ZZ  TDU 06/04/18    1247.27     CCR     698     P304    
26979622    3258    ZZ  TDU 09/04/18    1942.33 1000.00 ACT     698     PP89    
27212145    3215    ZZ  TDU 10/03/18    2487.54     CCR     609     P202    
27444640    3258    ZZ  H5  11/03/18    23182.36    2635.00 BBB     640 1234    PP89    
27909630    3216    ZZ  XC8 01/04/19    3370.00     ACT     691     P316    
28560616    3259    ZZ  BDX 04/03/19    460.98      ACT     607     P100    
25073192    3215    ZZ  TDU 12/04/17    445.50      CCR     713 1234    P202    
25259188    3215    ZZ  TDU 01/04/18    899.35      CCR     667     P303    
25677679    3259    ZZ  TDU 03/03/18    3863.95     CCR     18328       P101    
26096170    3259    ZZ  TDU 05/03/18    10321.97        BBB     649 8754    P402    

我需要读入这个文件并只将填充了 FiId 的行导出到一个新文件中。

我有这样的效果:

((Get-Content $InFile -Raw -ReadCount 4000) -Match "(?m)^.*\t[0-9]{1,4}\t[A-Z0-9]{0,9}\t$") |
            Set-Content $OutFile

我已经测试了正则表达式和变体 [https://regex101.com/r/jJ39oy/1] 但是我不能让它只导出我想要的东西。它要么导出整个文件,要么不导出任何内容。我每天需要从这个文件中导出大约 30k 行。

【问题讨论】:

  • 您的样本数据中没有任何选项卡...这使得几乎不可能确定哪些数据与哪一列对应。 [sigh ...] ///// 还有,Fild 列在哪里?我看到看起来像Rec FiId - 实际上是两列吗?
  • 试试Get-Content $InFile | Select-String -Pattern '^.*\t[0-9]{1,4}\t[A-Z0-9]{0,9}\s*$' | Select -ExpandProperty line | Set-Content $OutFile,见this thread
  • 再次复制/粘贴样本数据,但仍会转换为制表符。链接的正则表达式上有标签。

标签: regex powershell


【解决方案1】:

我认为最简单的方法是使用 Import-CSV 导入文件,然后过滤具有值的 FiId 字段并使用 Export-CSV 将其导出:

$values = Import-Csv -Path 'file1.ext' -Delimeter "`t" #specifies the tab delimeter
$values | Where-Object {-not [string]::IsNullOrEmpty($_.FiId)} | Export-Csv -Path 'file2.ext' -Delimeter "`t"
(Get-Content -Path 'file2.ext').Replace('"','') | Out-File -FilePath 'file3.tdv'

不幸的是,Export-Csv 添加了引号,但它们很容易去掉。不再是 RegEx 的噩梦。

编辑: 如果您喜欢单线:

(Import-Csv -Path .\test.tdv -Delimiter "`t" | Where-Object {-not [string]::IsNullOrEmpty($_.FiId)} | ConvertTo-Csv -Delimiter "`t").Replace('"','') | Out-File -FilePath .\filtered.tdv

这也切断了中间的文件。您可以在多行流程中使用相同的技术并将结果分配给变量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-22
    • 2015-03-31
    • 1970-01-01
    • 2012-09-16
    相关资源
    最近更新 更多