需要帮助解析Java中的文件

问题描述:

我目前正在做一个小型数据结构项目,并且我试图获得全国各地大学的数据;然后用它们做一些数据处理。我发现这个数据在这里:http://archive.ics.uci.edu/ml/machine-learning-databases/university/university.data需要帮助解析Java中的文件

,但这个数据的问题是(我从网站引用):“这是在数据文件末尾的一些相关功能的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))) 

我最感兴趣的数据是学生人数,学术重点和校名。

任何帮助,非常感谢。

您可以工作/使用的Lisp文件分析器,或者你可以忽略它的写在语言和重点数据。你刚才提到你需要:

  • 校名
  • 学生人数
  • 学术重点

可以grep相关的关键字(DEF实例,没有的,学生,学业加重),这将离开你(根据你的例子):

(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)) 

这简化了写一个spe cific parser(def-instance之后是名称,然后是下一个def-instance之前的所有学术重点和no-of-students都指的是以前定义的名称)

如果你要口齿不清解析,您需要知道“堆栈”的。

当你遇到一个(,你推到堆栈中。你现在处于一个新的范围内,比你之前的水平高出一个水平。

Similiarly,当你遇到一个你)弹出堆栈 - 完成该层和下降的水平。

因此,在这种情况下,你在空状态开始。你遇到的第一件事是(,所以现在你处于“定义”状态。 (我刚刚做完了,可以随意调用它)。你遇到def-instance令牌,然后是大学的名字。你继续阅读,你会遇到另一个((忽略空白,只解析令牌。)这使你处于属性状态。 (我也是这样做的)。既然你是从定义跳转到属性,那么现在就创建你的对象是可以的。喜欢的东西UnivData data = new UnivData(parsedToken)(凡parsedToken评估为“阿德菲”

好回特性 - 你读过第一(,那么你读“状态”和“纽约”,接着又)所以,你可以分配将当前UnivData的状态变量设置为newyork

您对所有属性重复此行为,但在学术重点后遇到其他)这是您提示关闭当前对象并开始寻找另一个对象。

起初,我还是忍不住要说使用地图。有多个ACAD的事实emic-emphasis令牌表示您应该使用更好的数据结构,可能是Map>。它可能更好地推出自己的Property类,它有一个字符串,或者如果它获取多个值,它切换到一个字符串列表。

你有没有关于在a中运行该Lisp文件用于Java VM的Lips解释器?

作为一个例子,与JSR-223兼容的Armed Bear Common Lisp会简单地解析你的文件。

并使用JSR-233,您将能够访问脚本定义的变量(如Adephi和其他),如examples show。

编辑从评论请求,一些补充说明(尽管对我来说似乎很简单)。

所以,假设你在你的类路径中有Armed bear Common Lisp,并且file是你的脚本的绝对文件名(这个例子很受启发/从JSR-223 example借来)。

首先,安装脚本引擎

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

然后,加载脚本脚本引擎

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

现在,一个小的调试器的武装,去看看有什么在(我不是胆子足够多安装所有的环境来为你做这项工作)

+0

我该怎么做呢? – Brendan 2011-04-06 21:00:06