2009-12-29 5 views
1

Я управляю небольшим сообществом онлайн-игр и обрабатываю базу данных учетных записей.Результаты поиска и отображения результатов [java]

Установка заключается в следующем:

Папки с именем Accounts Внутри каталога учетных записей, есть 200,000+ текстовых файлов, организованные по имени игрока. Доступ к этой папке вручную - это боль из-за необходимой оперативной памяти для поиска и поиска файлов. Я нахожу это очень неудобным.

Я обращаюсь к этому каталогу, чтобы отправлять напоминания о пароле или рекорды о том, кто играет дольше всех.

Ниже приведен пример файла учетной записи. Этот файл называется Falcon.txt

[ACCOUNT] 
character-username = Falcon 
character-password = falconpassword 

[INFO] 
character-coordx = 3252 
character-coordy = 3432 
character-active = yes 
character-ismember = 1 
character-messages = 5 
character-lastconnection = [removed] 
character-lastlogin = 2009-11-29 
character-energy = 100 
character-gametime = 193 
character-gamecount = 183 

[EQUIPMENT] 
character-equip = 0 4724 0 
character-equip = 1 1052 0 
character-equip = 2 6585 0 
character-equip = 3 4151 0 
character-equip = 4 4720 0 
character-equip = 5 1215 0 
character-equip = 6 -1 0 
character-equip = 7 4722 0 
character-equip = 8 -1 0 
character-equip = 9 775 0 
character-equip = 10 1837 0 
character-equip = 11 -1 0 
character-equip = 12 6735 0 
character-equip = 13 -1 0 

[APPEARANCE] 
character-look = 0 1 
character-look = 1 1 
character-look = 2 2 
character-look = 3 3 
character-look = 4 5 
character-look = 5 2 

[STATS] 
character-skill = 0 1 0 
character-skill = 1 1 0 
character-skill = 2 1 0 
character-skill = 3 1 0 
character-skill = 4 1 0 
character-skill = 5 1 0 
character-skill = 6 1 0 
character-skill = 7 1 0 
character-skill = 8 1 0 
character-skill = 9 1 0 
character-skill = 10 1 0 
character-skill = 11 1 0 
character-skill = 12 1 0 
character-skill = 13 1 0 
character-skill = 14 1 0 
character-skill = 15 1 0 
character-skill = 16 1 0 
character-skill = 17 1 0 
character-skill = 18 1 0 
character-skill = 19 1 0 
character-skill = 20 1 0 

[ITEMS] 

[BANK] 

[FRIENDS] 

[IGNORES] 

[END] 

Существует огромная база данных и поиск по каталогу в файлах для значений.

Значения Я имею в виду идентификаторы элементов или IP-адреса для поиска и отслеживания других учетных записей.

Однако у меня есть новая проблема, и моя разработка для этого грохота.

Как вы можете видеть в файле, строки организованы вкладками.

character-equip = 0 4724 1 

Если я ставлю значение 4724 в моем приложении поиска, я хочу, чтобы распечатать вкладку значение 1 справа от найденного результата поиска. Я хочу, чтобы он распечатывал значение только для найденных результатов, а не дополнительных результатов.

Таким образом, поиск может выглядеть следующим образом:

1 "Введите элемент для поиска:"
2: "Счет Falcon.txt имеет 1" "Введите элемент для поиска 4724"
нажмите любую клавишу для продолжения ...

Или, если там было больше количество этого оборудованного пункта

character-equip = 5 1239 102 

1. «Введите элемент для поиска:»
2. «Введите элемент для поиска: 1239 "
3.« У счета Falcon2.txt есть 102! »
нажмите любую клавишу, чтобы продолжить ...

Я просто хочу ввести идентификатор элемента и показать его после найденного значения. Белое пространство - это вкладка. Я попытался сделать это, и единственный успешный способ получить какой-либо результат - поместить вкладку между поисковым термином. Так что, если я хочу, чтобы найти элемент 1239 типа документа это в CMD линии:

Enter item to find:<tab>1239<tab> 

Было бы тогда искать то, что и будет отображать учетные записи с этим элементом в нем. Однако мне все же приходится индивидуально открывать счета, чтобы узнать количество этого элемента. Я хочу, чтобы результаты поиска отображали количество элемента, если значение найдено. Однако, если значение является количеством и оно пытается выполнить поиск по одной вкладке, я хочу, чтобы она либо пропустила, либо произнесла нуль.

Это то, что я имею в виду.

character-equip = 0 1024 1239 

Enter item to find: 1239 

Если он попадет этот счет, я хочу, чтобы результаты поиска отображается ноль, если он не может вкладку более или просматривать любые значения в белом пространстве. Поэтому он будет отображаться как нуль или ноль У учетной записи Falcon3.txt есть null!

или

Account Falcon3.txt has 0! 

Я пытался это сделать, но я не уверен, как этого добиться.

Вот мой код.

import java.io.*; 
import java.util.*; 

public class ItemDatabase { 

    public static void main(String args[]) { 

     System.out.print("Enter item to find: "); 
     Scanner sc = new Scanner(System.in); 
     find(sc.nextLine()); 
    } 

    public static void find(String delim) { 
     File dir = new File("accounts"); 
     if (dir.exists()) { 
      String read; 
      try { 
       File files[] = dir.listFiles(); 
       for (int i = 0; i < files.length; i++) { 
        File loaded = files[i]; 
        if (loaded.getName().endsWith(".txt")) { 
         BufferedReader in = new BufferedReader(new FileReader(loaded)); 
         StringBuffer load = new StringBuffer(); 
         while ((read = in.readLine()) != null) { 
          load.append(read + "\n"); 
         } 
         String delimiter[] = new String(load).split(delim); 

         if(delimiter.length > 1) { 
         System.out.println("Account " + loaded.getName() + "has " + delimiter[1] + "!"); 
         } 
        } 
       } 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } else { 
      System.out.println("error: dir wasn't found!"); 
     } 
    } 
} 

Спасибо, ребята, я надеюсь, вы можете мне помочь.

+0

200.000 счетов! Вы вызываете коллекцию файлов в базу данных, есть ли причина, по которой вы не настроили базу данных для хранения всех этих данных? Если бы вы сделали этот поиск, это было бы почти неявной функцией системы. – rsp

+0

rsp: Иногда разработка этих вещей начинается как персональный проект для друзей, а затем просто разрастается в размерах. Очень немногие делают подготовительные работы для интенсивного использования в своих проектах по хобби. – Esko

ответ

6

Это просто крик для базы данных. Если весь ваш конец работает в одном java-процессе, я бы рекомендовал пойти с чем-то вроде Apache Derby или H2.

Если вы предпочитаете не перемещаться в базу данных, и основная проблема заключается в том, чтобы перечислять все записи в одном каталоге, можете ли вы разделить ее на иерархию. Ваша учетная запись Falcon затем может быть расположена в F/FA/Falcon.txt - каждый каталог будет содержать более управляемое количество файлов.

+0

Когда я читал и прокручивал вниз, я кричал «Использовать базу данных!». Затем я увидел ваш комментарий! Потрясающие! +1 – les2

+0

Спасибо за предложение, я попытаюсь создать базу данных SQL для этого и избавиться от текстовых файлов. –

0

Помимо необходимости в базе данных, вы могли бы реализовать свое решение более интуитивно и легко, используя утилиты командной строки, такие как find, grep и т. Д., Или язык обработки текста, такой как perl.

Может

grep '[0-9]+\t[0-9]+\t1239' Account_Falcon3.txt 

бы вернуть

character-equip = 0 1024 1239 

Вы могли бы легко видеть, что значение 0 для этого элемента.

Я не могу подчеркнуть, что необходимо не написать программу на Java, чтобы сделать это - вы не будете так хорошо работать, как авторы стандартных утилит оболочки. Посмотрим правде в глаза, тот факт, что вы задаете этот вопрос, указывает на то, что вы новичок! :) (Мы все новички в зависимости от темы).

+0

Ничего себе, спасибо, ха-ха, я точно знаю! Вы меня подбадривали =) Спасибо, что я действительно не хотел настраивать БД, и это будет работать отлично! Спасибо, друг, хахаха, очень благодарю вас за то, что вы сделали меня днем. знак равно –

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