PowerShell - импорт текстового файла и фильтра - PullRequest
0 голосов
/ 24 октября 2019

Требуется: импорт большого текстового файла с разделителями табуляции, размером от 3,5 до 5,5 миллионов строк. Экспортировать только совпадающие строки в отдельный файл.

Содержимое файла (также есть вкладки в конце строки):

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], однако я не могу его получитьэкспортировать только то, что я хочу. Он либо экспортирует весь файл, либо ничего не экспортирует. Всего из этого файла нужно экспортировать около 30 тысяч строк каждый день.

1 Ответ

0 голосов
/ 24 октября 2019

Я думаю, что самым простым способом было бы импортировать ваш файл с помощью 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

Это также вырезает файл в середине. Вы можете использовать ту же технику в многострочном процессе и просто присвоить результаты переменным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...