我有一個包含數千行的 TXT 檔案。第一個斜線后面的數字是影像 ID。我想洗掉所有行,以便每個 ID 只保留一行。哪條線被殺死并不重要。
我嘗試使用 Powershell 將 TXT 通過管道傳輸到 CSV 并使用唯一引數。但它沒有用。任何想法如何遍歷 TXT 并終止所有行,以便每個唯一 ID 始終只保留一行?:/
今日狀態
thumbnails/4000896042746/2021-08-17_4000896042746_small.jpg
thumbnails/4000896042746/2021-08-17_4000896042746_smallX.jpg
thumbnails/4000896042333/2021-08-17_4000896042746_medium.jpg
thumbnails/4000896042444/2021-08-17_4000896042746_hugex.jpg
thumbnails/4000896042333/2021-08-17_4000896042746_tiny.jpg
腳本之后
thumbnails/4000896042746/2021-08-17_4000896042746_small.jpg
thumbnails/4000896042333/2021-08-17_4000896042746_medium.jpg
thumbnails/4000896042444/2021-08-17_4000896042746_hugex.jpg
uj5u.com熱心網友回復:
如果它涉及“具有數千行的 TXT 檔案”,我會為此使用PowerShell 管道,因為(如果正確設定)它將執行相同的操作,但使用的記憶體要少得多。使用基于二進制搜索的HashTable(或HashSet)實際上可能會提高性能(因此比分組要快得多)。(我懇求將加速的HashSet放入 PowerShell)
#16003
$Unique = [System.Collections.Generic.HashSet[string]]::new()
Get-Content .\InFile.txt |ForEach-Object {
if ($Unique.Add(($_.Split('/'))[-2])) { $_ }
} | Set-Content .\OutFile.txt
uj5u.com熱心網友回復:
您可以按自定義屬性分組。因此,如果您知道自己的 ID 是什么,那么您只需按此分組,然后從組中取出第一個元素:
$content = Get-Content "path_to_your_file";
$content = ($content | group { ($_ -split "/")[1] } | % { $_.Group[0] });
$content | Out-File "path_to_your_result_file"
uj5u.com熱心網友回復:
這是一個使用計算屬性創建包含 ID 和檔案名的物件的解決方案。然后我根據 ID 對結果進行分組,遍歷每個組并選擇第一個 FileName:
$yourFileList = @(
'thumbnails/4000896042746/2021-08-17_4000896042746_small.jpg',
'thumbnails/4000896042746/2021-08-17_4000896042746_smallX.jpg',
'thumbnails/4000896042333/2021-08-17_4000896042746_medium.jpg',
'thumbnails/4000896042444/2021-08-17_4000896042746_hugex.jpg',
'thumbnails/4000896042333/2021-08-17_4000896042746_tiny.jpg'
)
$yourFileList |
Select-Object @{Name = "Id"; Expression = { ($_ -split '/')[1] } }, @{ Name = 'FileName'; Expression = { $_ } } |
Group Id |
ForEach-Object { $_.Group[0].FileName }
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/333064.html
標籤:电源外壳
