2011-04-06 22 views
0

我目前正在做一個小型數據結構項目,並且我試圖獲得全國各地大學的數據;然後用它們做一些數據處理。我發現這個數據在這裏: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))) 

我最感興趣的數據是學生人數,學術重點和校名。

任何幫助,非常感謝。

回答

3

您可以工作/使用的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都指的是以前定義的名稱)

1

如果你要口齒不清解析,您需要知道「堆棧」的。

當你遇到一個(,你推到堆棧中。你現在處於一個新的範圍內,比你之前的水平高出一個水平。

Similiarly,當你遇到一個你)彈出堆棧 - 完成該層和下降的水平。

因此,在這種情況下,你在空狀態開始。你遇到的第一件事是(,所以現在你處於「定義」狀態。 (我剛剛做完了,可以隨意調用它)。你遇到def-instance令牌,然後是大學的名字。你繼續閱讀,你會遇到另一個((忽略空白,只解析令牌。)這使你處於屬性狀態。 (我也是這樣做的)。既然你是從定義跳轉到屬性,那麼現在就創建你的對象是可以的。喜歡的東西UnivData data = new UnivData(parsedToken)(凡parsedToken評估爲「阿德菲」

好回特性 - 你讀過第一(,那麼你讀「狀態」和「紐約」,接着又)所以,你可以分配將當前UnivData的狀態變量設置爲newyork

您對所有屬性重複此行爲,但在學術重點後遇到其他)這是您提示關閉當前對象並開始尋找另一個對象。

起初,我還是忍不住要說使用地圖。有多個ACAD的事實emic-emphasis令牌表示您應該使用更好的數據結構,可能是Map>。它可能更好地推出自己的Property類,它有一個字符串,或者如果它獲取多個值,它切換到一個字符串列表。

1

你有沒有關於在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