2015-01-16 7 views
0

У меня есть logdata, который содержит даты и IP-адреса.
Теперь я хочу знать, какой IP-адрес для этого дня.
Я использовал хэш-карту для использования ключа < => пары значений.
Но, к сожалению, есть дубликаты, как:
Как отсортировать hashmap, содержащий массивы

Day1<=>IP1, Day1<=>IP2, Day1<=>IP3, Day2<=>IP1, Day3<=>IP2, Day3<=>IP1 

Я использовал, чтобы использовать массивы в качестве пары ключей < => значения, так что я все еще могу использовать
дубликатов, как hashentries. Могу ли я группа выход Хеш
так, что он отображает SMTH так:
date<=>IP1, IP2, IP3
date<=>IP1, IP2, IP3?

Я думал о методе group-object.

/редактировать:

Sampe вход может быть:

26.12.2014 1.1.1.1 
28.12.2014 2.2.2.2 
29.12.2014 1.1.1.1 
29.12.2014 2.2.2.2 
30.12.2014 2.2.2.2 
30.12.2014 3.3.3.3 
30.12.2014 3.3.3.3 
30.12.2014 3.3.3.3 
30.12.2014 4.4.4.4 
30.12.2014 1.1.1.1 
30.12.2014 2.2.2.2 

Я пытаюсь получить все доступ в день. Все записи представляют собой массивы
, потому что у вас не может быть нескольких значений для ваших ключей.
Желаемый результат должен быть чем-л так:

26.12.2014: 1
28.12.2014: 1
29.12.2014: 2
30.12.2014: 7

В число дисплеев доступ в день.

/редактировать 2:

пример кода, как это:

$items = Get-ChildItem "$PSScriptRoot\*file*" 
foreach ($item in $items) 
{ 
    $item_name = $item.Name 
    $content = [System.IO.File]::ReadAllLines("$PSScriptRoot\$item_name") 

    $hash = @{} 

    foreach($line in $content) 
    { 
     $hash.Add(@(((filter_date($line)).split(" ")[1])),  @(((filter_date($line)).split(" ")[0]))) 
    } 
} 

filter_date является soubroutine, который отсекает IP и дату в каждой строке.

+0

Мне нужен образец ввода для правильного понимания вашего вопроса, а не только чертежа/концепции. Просьба предоставить образец ввода и желаемый выход. Являются ли входными несколькими текстовыми файлами? Если это так, включите несколько строк из одного из них (без каких-либо конфиденциальных данных). Что вы пробовали? –

+0

Является ли это текстовым файлом или вы получаете массив строк из API и т. Д.? Не могли бы вы включить скрипт, который вы используете сегодня/ранее использовали? –

+0

Источник - это папка, которая содержит много файлов logdatafiles. У меня было около 1000 текстовых файлов, которые я читал в цикле, файле на файл и вырезал определенные строки.Это очень быстро работает для меня. Выводом, конечно же, являются строки, в которых я продолжаю обработку. –

ответ

1

Кажется, вы хотите, чтобы количество записей в день в списке сортировалось по датам. Если это так, я бы рекомендовал создать единую хеш-таблицу для всего скрипта с датой в качестве ключа и простым значением int -counter. Если вам не нужно сохранять IP-адреса, то их хранение - пустая трата времени и ресурсов. Попытайтесь:

#Create hashtable to store date = access per day. 
$hash = @{} 

#Get files 
$items = Get-ChildItem "$PSScriptRoot\*file*" 

foreach($item in $items) { 

    #The FullName-property of a FileInfo-object (result from Get-ChildItem) contains full filepath. 
    $content = [System.IO.File]::ReadAllLines($item.FullName) 

    foreach($line in $content) { 

     $data = filter_date($line).Split(" ")#Expecting 2 parts: [0] = Date, [1] = IP 

     if($hash.ContainsKey($data[0])) { 
      #Date previously registered, count = count + 1 
      $hash[$data[0]] += 1 
     } else { 
      #First instance of date, count = 1 
      $hash[$data[0]] = 1 
     } 
    } 
} 

#Loop through hash 
$hash.GetEnumerator() | 
#Sort by date 
Sort-Object { [datetime]::ParseExact($_.Key, 'dd.MM.yyyy', $null) } | 
#Format result 
ForEach-Object { "$($_.Key): $($_.Value)" } 

26.12.2014: 1 
28.12.2014: 1 
29.12.2014: 2 
30.12.2014: 7 
+0

Спасибо, это сработало отлично. Я думал слишком сложно, чтобы получить это решение для себя ... –

1

Любая помощь? (Отредактировано для новых требований и данных образца)

$data = 
(@' 
26.12.2014 1.1.1.1 
28.12.2014 2.2.2.2 
29.12.2014 1.1.1.1 
29.12.2014 2.2.2.2 
30.12.2014 2.2.2.2 
30.12.2014 3.3.3.3 
30.12.2014 3.3.3.3 
30.12.2014 3.3.3.3 
30.12.2014 4.4.4.4 
30.12.2014 1.1.1.1 
30.12.2014 2.2.2.2 
'@).split("`n") 

$ht = [ordered]@{} 

$data | 
foreach {$ht[$_.split()[0]]++} 

[PSCustomObject]$ht | format-list 



26.12.2014 : 1 
28.12.2014 : 1 
29.12.2014 : 2 
30.12.2014 : 7 
+0

Вам не нужно разделять пробелы на каждую запись? Как .split ("")? –

+0

@mushroomer - это значение по умолчанию для .split(). Он просто используется для предоставления выборочных данных. Я уверен, что фактический файл журнала выглядит совсем по-другому, а в OP уже есть какой-то метод для разбора этих двух значений. – mjolinor

+0

Он разделяет каждую строку в пробеле. –

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