2015-02-09 104 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