#java
#java
Вопрос:
У меня есть журнал сервера, отформатированный следующим образом:
128.33.100.1 2011-03-03 15:25 test.html
Мне нужно извлечь из этого несколько вещей, но я в основном зациклен на том, как получить общее количество посещений в час, а также количество уникальных посетителей на страницу. Любые указания были бы оценены.
Ответ №1:
Предполагая, что в вашем файле журнала есть только эти строки. Вот как, я думаю, вам следует это сделать. (Предполагается, что база данных не задействована)
-
Создайте класс, который представляет каждую строку (модель), содержащую IP, дату, время, файл
-
Вы можете добавить метод в эту модель, который возвращает временную метку java на основе даты.
-
Затем создайте хэш-карту, которая хранит имя файла в виде ключей и список объектов вышеуказанного класса в виде значений
-
Начинайте читать по строчке за раз.
-
Для каждой строки a. Используйте StringTokenizer, чтобы получить IP, дату, время и файл в качестве токенов b. Заполните объект вышеуказанного класса c. Добавьте этот объект в список, соответствующий имени файла в хэш-карте. (создайте новый, если он не существует)
-
Теперь у вас есть все данные в удобной структуре данных.
Чтобы получить количество уникальных посетителей для каждой страницы: 1. Просто извлеките список, соответствующий правильному имени файла, из формы хэш-карты. Здесь вы можете запустить простой алгоритм для подсчета количества уникальных IP-адресов. Для этого также можно использовать функциональность Java Collections.
Чтобы получить количество посещений в час для каждой страницы: 1. снова извлеките правильный список, как указано выше, и установите отметку минимального и максимального времени. 2. узнайте время в часах. затем разделите общее количество записей в списке на часы.
Надеюсь, это поможет.
Ответ №2:
Если вы разбиваете строку на массив, я бы предложил вычленить час из 3-го элемента и выполнить проверку для всех предыдущих строк таким же образом, начиная с первого раза, когда вы видите 15, до первого раза, когда вы видите 16, со счетчиком, хранящим количество обращений за этот час.
Разделение строки может быть выполнено следующим образом:
String[] temp;
String str = "firstElement secondElement thirdElement";
String delimiter = " ";
temp = str.split(delimiter); //temp be filled with three elements.
Что касается уникальных посетителей на страницу, вы можете взять 1-й элемент массива, который вы использовали для разделения, и поместить это значение в HashMap со значением этого IP в качестве ключа и страницы, которую они посетили, в качестве значения. Затем выполните проверку хэш-карты с каждым входящим IP-адресом, и если его нет в it, вставьте его, и к концу у вас будет хэш-карта, заполненная уникальными элементами / IP-адресами.
Надеюсь, это вам немного поможет.
Ответ №3:
Преобразуйте записи журнала в java.util.Calendar
, а затем выполните свои вычисления для каждого уникального IP-адреса.
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
public class Visit
{
public static void main(String[] args) throws Exception
{
String []stats = "128.33.100.1 2011-03-03 15:25 test.html".split("\s ");
System.out.println("IP Address: " stats[0]);
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd hh:mm");
Date date = formatter.parse(stats[1] " " stats[2]);
Calendar cal = Calendar.getInstance();
cal.setTime(date);
System.out.println("On Date: " cal.get(Calendar.DATE) "/" cal.get(Calendar.MONTH) "/" cal.get(Calendar.YEAR));
System.out.println("At time: " cal.get(Calendar.HOUR_OF_DAY) ":" cal.get(Calendar.MINUTE));
System.out.println("Visited page: " stats[3]);
/*
* You have the Calendar object now perform your maths
*/
}
}
Ответ №4:
При разборе строки из журнала не:
- Выделите словарь (это должно быть сделано только один раз при запуске программы)
- Извлеките часть даты и времени
- Преобразуйте его в объект DateTime (.NET) или аналогичный объект для вашего языка программирования
- Установите для минут и секунд объекта date time значение 0
- Поместите дату и время в объект Dictionary, если он еще не существует.
- Увеличьте значение в элементе словаря, где Date time — это ваша текущая проанализированная дата-время
- В конце концов, этот словарь будет иметь ежечасные обращения