2015-01-24 2 views
0

У меня есть много текстовых файлов, содержащих расширенные символы ascii. Я хотел бы построить дедупликацией список этих символов, например:Хранить дедуплицированный список символов, отличных от ascii, в массиве

á 
ö 
¿ 

Я могу читать файлы и вырезать основные символы ASCII. Однако, поскольку я новичок в Powershell, как я могу разбить каждую строку на символы, сравнить их с существующим списком найденных символов и вывести дедуплицированный список несущественных символов ascii?

$files = Get-ChildItem "C:\Users\me\Desktop\ascii" -filter "*.txt" 
Foreach ($file in $files) { 
    $newfile = @() 

    Get-Content $file.fullname | Foreach-Object { 
     $newfile += [string]([char[]]$_ | where-object {[int]$_ -lt 127}) 
    } 
    Write-Host $newfile 
} 

[править 1] Как добраться ...

$files = Get-ChildItem "C:\Users\me\Desktop\ascii" -filter "*.txt" 
$array = @() 

Foreach ($file in $files) { 
    Get-Content $file.fullname | Foreach-Object { 
     $line = [string]([char[]]$_ | where-object {[int]$_ -lt 127}) -split '\s+' | Foreach { 
      If ($array -notcontains $_) { 
       $array.Add($_) 
      } 
     } 
    } 
} 

[редактировать 2] Этот ^^^ работает в PS 4, но не в 2 (который у меня на сервере)? Любая помощь в написании версии совместимой с PS2?

[править 3] Я обнаружил, что использование $array = @() отлично работает на V2 и V4 :-)

ответ

0

Любая помощь? (Требуется V3)

$string = 'áTestáöö¿' 

$ht = @{} 

$basic,$extended = ([char[]]$string).Where({[int]$_ -lt 127},'Split') 
$extended | foreach {$ht[$_] += $null} 

[string]$basic 

$ht.keys 
T e s t 
¿ 
ö 
á 
+0

У меня есть только V2 доступный :-(увидеть мой 2-ой редактирование ... – Pr0no

1

Может быть, я что-то не хватает, но не вы должны проверить для значений больше чем 127, если вы строите список расширен ASCII символов?

Это должно дать вам список расширенных символов ASCII из всех файлов без дубликатов:

Get-ChildItem 'C:\Users\me\Desktop\ascii' -filter '*.txt' | 
    Get-Content | 
    % { [char[]]$_ } | 
    ? { [int]$_ -gt 127 } | 
    select -Unique 
+0

FYI, нет необходимости цитировать либо путь или аргумент фильтра (если у них нет пробелов). Это просто бессмысленно, дополнительная набрав. ;-) –

+0

Правда, но есть и другие ситуации, когда используются кавычки * must *, даже если строка не содержит пробелов (например присваивания: '$ pattern = '* .txt''). Таким образом, я привык всегда использовать цитаты вокруг строковых литералов. Кроме того, это помогает с подсветкой синтаксиса. ;) –

+0

'$ pattern = '* .txt'' - синтаксический анализ выражения, и я думаю, что большинство людей ожидали, что они будут приводиться в этом сценарии. Я просто думаю, что мы (топ-ответчики) должны представить PowerShell как можно более простым, насколько это возможно. Учитывая его огромную площадь поверхности, в этом отношении нужна небольшая помощь. Во всяком случае, еще +1 для этого ответа. ;-) –

Смежные вопросы