0


我对编程比较陌生。我必须处理一个包含已婚夫妇嵌套数据的海量文件,如下所示。我尝试使用 Perl 编写程序,但设置这么多标志以进入每个以 { 开头并以 } 结尾的嵌套数据似乎不是处理这些数据的有效方法。我正在就如何在 Perl 中最好地处理如下数据寻求您的建议。

万分感谢。安迪

我有一些如下所示的数据:

city{
 area : 50 sq miles ;
 population : 3000 ;
 healthIndex : 90.5/100 ;

 marriedCouples { //this begins one married couple data
  children : 2 ;
  chronologicalData() {
   date: 02-10-1990 ;
   incomeRising("TableVals") {
    values("0 1 2 3 4 5 6 7 8 9") ;
   }
   incomeFalling("TableVals") {
    values("0 1 2 3 4 5 6 7 8 9") ;
   }
  }
  child {
   name: Nathan;
   chronologicalData() {
     DOB: 02-13-1994 ;

    incomeRising("TableVals") {
     values("0 2 2 3 4 9 6 7 8 9") ;
    }
    incomeFalling("TableVals") {
     values("0 1 2 1 1 1 6 7 8 9") ;
    }
   }
   intrinsicVal() {
    risingVals {
     values("0 0.1 0.33 0.34 0.6 0.9 0.11 0.123 0.14 0.15") ;
    }
    fallingVals {
     values("0.15 0.10 0.09 0.08 0.08 0.078 0.75 0.6 0.5 0.4") ;
    }
   }
  }
 } // this finishes one married couple data

  child {  //Note that this child is not within the married couple and is a stand-alone child. It is outside of it
   name: Cody;
   chronologicalData() {
     DOB: 02-13-1974 ;

    incomeRising("TableVals") {
     values("0 12 22 33 44 49 56 57 58 59") ;
    }
    incomeFalling("TableVals") {
     values("0 41 32 21 21 19 18 17 16 15") ;
    }
   }
   intrinsicVal() {
    risingVals {
     values("0 0.1 0.331 0.34 0.6 0.9 0.11 0.123 0.14 0.125") ;
    }
    fallingVals {
     values("0.55 0.10 0.09 0.08 0.08 0.078 0.75 0.6 0.5 0.4") ;
    }
   }
  } // End stand alone child
} // End city data
4

1 回答 1

0

如果这是您可以重复执行的任务,我会考虑为这种迷你语言编写简单的解析器。即使从头开始似乎也不是很难,https: //metacpan.org/pod/Parse::RecDescent 可能会有一些用处(如果不是矫枉过正的话)。

如果我很着急,必须处理一次这样的文件,并且这个文件将低于 100MB,我会....在 emacs 中打开该文件的副本并进行一些正则表达式替换以使其本身正确 perl(或,如果文件很大,编写简短的脚本来使那些正则表达式替换)。那不远了,比如:

city => {
    area => "50 sq miles",
    marriedCouples => { # this begins one married couple data
       children => 2, 
       #...
       values => qw(0 0.1 0.331 0.34 0.6 0.9 0.11 0.123 0.14 0.125),
    },

是正确的perl,所以改变像

  • 交换:(任何东西);with => "(任何东西)",
  • 在每个 } 之后添加 ,
  • 用 ("...") 制作 qw

会靠近...

于 2015-02-03T22:32:42.563 回答