Нужна помощь в разборе файла в Java - PullRequest
0 голосов
/ 06 апреля 2011

В настоящее время я занимаюсь небольшим проектом структур данных и пытаюсь получить данные об университетах по всей стране;а затем сделать некоторые манипуляции с данными с ними.Я нашел эти данные здесь: http://archive.ics.uci.edu/ml/machine-learning-databases/university/university.data

НО, проблема с этими данными (и я цитирую с веб-сайта): «Это читаемый файл LISP с несколькими соответствующими функциями наконец файла данных. "Я планирую взять эти данные и сохранить их в виде файла .txt.

Файл выглядит примерно так:

(def-instance Adelphi
      (state newyork)
      (control private)
      (no-of-students thous:5-10)
      (male:female ratio:30:70)
      (student:faculty ratio:15:1)
      (sat verbal 500)
      (sat math 475)
      (expenses thous$:7-10)
      (percent-financial-aid 60)
      (no-applicants thous:4-7)
      (percent-admittance 70)
      (percent-enrolled 40)
      (academics scale:1-5 2)
      (social scale:1-5 2)
      (quality-of-life scale:1-5 2)
      (academic-emphasis business-administration)
      (academic-emphasis biology))
(def-instance Arizona-State
      (state arizona)
      (control state)
      (no-of-students thous:20+)
      (male:female ratio:50:50)
      (student:faculty ratio:20:1)
      (sat verbal 450)
      (sat math 500)
      (expenses thous$:4-7)
      (percent-financial-aid 50)
      (no-applicants thous:17+)
      (percent-admittance 80)
      (percent-enrolled 60)
      (academics scale:1-5 3)
      (social scale:1-5 4)
      (quality-of-life scale:1-5 5)
      (academic-emphasis business-education)
      (academic-emphasis engineering)
      (academic-emphasis accounting)
      (academic-emphasis fine-arts))

      ......

The End Of the File:

(dfx def-instance (l)
  (tlet (instance (car l) f-list (cdr l))
    (cond ((or (null instance) (consp instance))
           (msg t instance " is not a valid instance name (must be an atom)"))
          (t (make:event instance)
             (push instance !instances)
             (:= (get instance 'features)
                 (tfor (f in f-list)
                   (when (cond ((or (atom f) (null (cdr f)))
                                (msg t f " is not a valid feature "
                                       "(must be a 2 or 3 item list)") nil)
                               ((consp (car f))
                                (msg t (car f) " is not a valid feature "
                                     "name (must be an atom)") nil)
                               ((and (cddr f) (consp (cadr f)))
                                (msg t (cadr f) " is not a valid feature "
                                     "role (must be an atom)") nil)
                               (t t)))
                   (save (cond ((equal (length f) 3)
                                (make:feature (car f) (cadr f) (caddr f)))
                               (t (make:feature (car f) 'value (cadr f)))))))
             instance))))

(set-if !instances nil)



(dex run-uniq-colleges (l n)
  (tfor (sc in l)
    (when (cond ((ge (length *events-added*) n))
                ((not (get sc 'duplicate))
                 (run-instance sc)
~                 (remprop sc 'features)
                 nil)
                (t (remprop sc 'features) nil)))
    (stop)))

Больше всего меня интересуют данные о количестве учеников, академических акцентах и ​​названии школы.

Любая помощь с благодарностью.

Ответы [ 3 ]

4 голосов
/ 06 апреля 2011

Вы можете работать с / использовать анализатор файлов Lisp или игнорировать язык, на котором он написан, и сосредоточиться на данных.Вы упомянули, что вам нужно:

  • Название школы
  • Количество студентов
  • Академические акценты

Вы можете grep соответствующие ключевые слова(def-instance, no-of-учеников, академический акцент), который оставит вас с (на основе вашего примера):

(def-instance Adelphi
      (no-of-students thous:5-10)
      (academic-emphasis business-administration)
      (academic-emphasis biology))
(def-instance Arizona-State
      (no-of-students thous:20+)
      (academic-emphasis business-education)
      (academic-emphasis engineering)
      (academic-emphasis accounting)
      (academic-emphasis fine-arts))

, который упрощает написание конкретного парсера (def-instance сопровождаетсяимя, затем все академические акценты и отсутствие учеников перед следующим определением экземпляра ссылаются на ранее определенное имя)

2 голосов
/ 06 апреля 2011

Хотели ли вы запустить этот Lisp-файл в интерпретаторе Lips для Java VM?

Например, Armed Bear Common Lisp , который совместим с JSR-223, был бы счастливпарсит ваш файл.

И, используя JSR-233, вы сможете получить доступ к переменным, определенным сценарием (например, Adephi и другие), например examples show.

РЕДАКТИРОВАТЬ Из запроса комментариев, несколько дополнительных объяснений (хотя мне это кажется довольно простым).

Итак, предположим, что у вас есть Общий Лисп вооруженного медведя в вашем пути к классам, и fileэто абсолютное имя файла вашего скрипта (этот пример в значительной степени вдохновлен / заимствован из JSR-223 пример ).

Сначала установите движок скрипта

ScriptEngineManager scriptManager = new ScriptEngineManager();
scriptManager.registerEngineExtension("lisp", new AbclScriptEngineFactory());
ScriptEngine lispEngine = scriptManager.getEngineByExtension("lisp");

Затем загрузите ваш сценарий в обработчик сценариев

Object eval = lispEngine.eval(new FileReader(file));

Теперь, вооружившись одним маленьким отладчиком, посмотрите, что в нем (я не смел, чтобы установить всю среду, чтобы выполнить эту работу за вас)

1 голос
/ 06 апреля 2011

Если вы собираетесь анализировать lisp, вам нужно знать о «стеке».

Когда вы сталкиваетесь с (, вы толкаете в стек. Теперь вы находитесь в новой области видимости, на один уровень выше, чем раньше.

Аналогично, когда вы сталкиваетесь с ), вы попадаете из стека - закончите этот слой и спуститесь на уровень.

Так что в этом случае вы находитесь в пустом состоянии, чтобы начать. Первое, с чем вы сталкиваетесь, это (, так что теперь вы находитесь в состоянии «определения». (Я только что это придумал. Называйте это как хотите.) Вы встречаете токен def-instance, а затем название университета. Вы продолжаете читать и сталкиваетесь с другим ( (Игнорировать пробелы, просто анализировать токены.) Это переводит вас в состояние свойств. (Я тоже это придумал.) Поскольку вы переходите от определения к свойствам, теперь все в порядке, чтобы создать свой объект. Что-то вроде UnivData data = new UnivData(parsedToken) (где parsedToken оценивается как «Адельфи».

Хорошо, вернемся к свойствам - сначала вы прочитали (, затем прочитали «state» и «newyork», а затем еще один ). Таким образом, вы можете присвоить переменной состояния текущей UnivData команду newyork.

Вы повторяете это поведение для всех свойств, но затем вы сталкиваетесь с дополнительным ) после академического акцента. Это ваша подсказка, чтобы закрыть текущий объект и начать поиск другого.

Сначала я испытывал желание сказать, использовать Карту. Тот факт, что есть несколько токенов с академическим акцентом, указывает на то, что вы должны использовать лучшую структуру данных, возможно, карту>. Может быть даже лучше прокрутить свой собственный класс Property со строкой, либо, если он получает несколько значений, он переключается на список строк.

...