需要帮助解析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));
现在,一个小的调试器的武装,去看看有什么在(我不是胆子足够多安装所有的环境来为你做这项工作)
我该怎么做呢? – Brendan 2011-04-06 21:00:06