我目前正在做一个小型数据结构项目,我正在尝试获取全国各大学的数据;然后用它们做一些数据操作。我在这里找到了这些数据: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)))
我最感兴趣的数据是学生人数,学业重点和学校名称。
非常感谢任何帮助。
答案 0 :(得分:4)
您可以使用/使用Lisp文件解析器,或者您可以忽略它所写的语言并专注于数据。你提到你需要:
你可以grep
相关的关键词(def-instance,no-of-student,学术重点),这会让你(基于你的例子):
(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后面跟着名称,然后所有学术重点和没有学生在下一个def-instance之前引用之前定义的名称)
答案 1 :(得分:2)
你有没有在Java VM的Lips解释器中运行那个Lisp文件?
作为一个例子,Armed Bear Common Lisp,它与JSR-223一样可以解析你的文件。
使用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));
现在,配备一个小调试器,去了解其中的内容(我没有勇气安装所有环境来为你完成这项工作)
答案 2 :(得分:1)
如果你要解析lisp,你需要知道'堆栈'。
当你遇到(
时,你会进入堆叠。你现在处于一个新的范围,比以前高出一个级别。
同样地,当你遇到)
时,你会从堆栈中弹出 - 完成该层并向下移动。
所以在这种情况下,你处于空状态开始。您遇到的第一件事是(
,所以现在您处于“定义”状态。 (我只是把它搞定了。无论你想要什么,都要调用它。)你会遇到def-instance token,然后是大学的名字。你继续阅读并遇到另一个(
(忽略空格,只需解析标记。)这会使你处于属性状态。 (我也是这样做的。)因为你从定义跳转到属性,所以现在可以制作你的对象了。像UnivData data = new UnivData(parsedToken)
之类的东西(其中parsedToken评估为“Adelphi”。
好的回到属性 - 你先读了(
,然后读了“state”和“newyork”,然后是另一个)
。因此,您可以将当前UnivData的状态变量分配给newyork。
您对所有属性重复此行为,但在学术强调后您会遇到额外的)
。这是关闭当前对象并开始寻找另一个对象的提示。
起初,我很想说使用地图。有多个学术重点令牌的事实表明你应该使用更好的数据结构,也许是Map>。滚动自己的具有String的Property类可能更好,或者如果它获取多个值,它会切换到字符串列表。