2015-02-09 103 views
1

作爲體育運動的書呆子,我期待每天使用由美國職業棒球大聯盟網站製作的XML文件,並將它們導入到Access或MySQL數據庫中。我遇到的問題是,他們生產的幾乎每個XML文件都與上一次的略有不同。例如,一個遊戲文件可能有一個名爲batter23的字段,它與event22相鄰,而另一個文件將其稱爲batter24,並且位於pitcher25的旁邊。我知道XML文件可能不一致,但我知道必須有一種方法來持續將數據存入數據庫。無論如何要標準化這些XML文件?一些代碼將解析列表中的每個文件,並將它們組織成特定的樣式併爲其提供一致的字段名稱?目前,我首先將XML文件導入到Excel工作表中,在那裏將文件類型更改爲CSV,但從那裏字段名稱和列位置仍然不同於文件。將XML數據導入到數據庫中

我的目標是讓結構中的所有文件每天都可以快速導入到數據庫中,而無需手動更改列位置或字段名稱。我願意接受任何選擇,但我在大多數語言中的體驗都是最好的菜鳥級別,所以請原諒我缺乏知識。

+0

爲了給出一個好的答案,您的XML示例是必要的。否則,這是一個基於意見的答案,這對於StackOverflow來說可能是不合適的。我建議將'perl'和'XML :: Twig'看作XML解析的很好選擇。 (如果你可以給出一個XML樣本和所需的輸出,我可以敲你一個例子)。 – Sobrique 2015-02-09 14:17:14

回答

2

這些文件是非常標準的,只要XML去..,你只需要確定每個文件所代表的。

我做了周圍紅襪v皇家遊戲咋一看,從9月14日(轉到紅襪!) 在year_2014/month_09/day_14/gid_2014_09_14_bosmlb_kcamlb_1/players.xml 我可以看到,奧爾蒂斯爲120074的ID。

如果我看着他的球員Id的擊球手,我可以看到他的那場比賽的數據。 (year_2014/month_09/day_14/gid_2014_09_14_bosmlb_kcamlb_1/batters/120074.xml)

它繼續。基本上,爲了將這些文件加載​​到數據庫中,您需要執行某些級別的處理才能使其具有意義。 這些ID在遊戲間似乎沒有改變,但我只是粗略一瞥。

至於加載數據,perl中的XML :: Simple可以很容易地接受一個XML並且吐出一個perl數據結構。除非你需要更重的東西,否則這應該會掩蓋你。

加載players.xml:

#!/bin/env perl 
use strict; use warnings; 

use Data::Dumper; 
use XML::Simple; 

my $players_xml = XMLin('players.xml'); 

print Dumper $xml; 

給你的東西,如:

$VAR1 = { 
    'venue' => 'Kauffman Stadium', 
    'date' => 'September 14, 2014', 
    'team' => { 
     'Boston Red Sox' => { 
      'id' => 'BOS', 
      'player' => { 
       '605141' => { 
        'avg' => '.283', 
        'team_abbrev' => 'BOS', 
        'parent_team_id' => '111', 
        'hr' => '4', 
        'team_id' => '111', 
        'status' => 'A', 
        'last' => 'Betts', 
        'rl' => 'R', 
        'parent_team_abbrev' => 'BOS', 
        'first' => 'Mookie', 
        'rbi' => '12', 
        'game_position' => '2B', 
        'num' => '50', 
        'position' => '2B', 
        'current_position' => '2B', 
        'boxname' => 'Betts', 
        'bats' => 'R', 
        'bat_order' => '1' 
       }, 
       ... 

它是那麼微不足道瀏覽這些散列和插入DB行,只要你喜歡。

+0

播放器XML文件以及可在線觀看的文件似乎都是非常標準的格式,我沒有看到文件間的很多變化。問題出現在Inning的Inning文件中,由於某種原因,這些文件似乎不能在線查看(但可通過perl解析腳本以某種方式下載)。我可以添加2個文件進行比較,但它們相當大而且很難看。您提供的perl腳本是否與不一致的字段名稱有關?例如:文件一將列表欄列爲「batter」,而文件2將其列爲「batter22」。提前致謝! – Jcmoney1010 2015-02-10 02:42:40

+0

也許一些網址指向您正在查看的文件,並且您看到的字段名稱會有所幫助。我只是看看同一場比賽的局,而且屬性是完全一致的(擊球手,投手等)。 – 2015-02-10 09:45:15

+0

在閱讀您最後的評論之後,我回過頭去檢查原始數據文件,並且您是對的,這些文件本身是一致的。起初我沒有意識到這一點,因爲我將它們導入到Excel中以便於查看。顯然,Excel正在重新命名標題行。不幸的是,我一直無法得到上面的代碼工作,所以我仍然堅持。我不斷收到「文件目錄不存在」或「權限被拒絕」的錯誤信息。這是我第一次嘗試perl,所以我可能只是做錯了。 – Jcmoney1010 2015-02-11 01:15:40