对账单拆分

* 拆分对账单
 * 
  * Created by albg on 2016/4/15.
  */
class SplitAccount {
  
  /**
   * inPath 源文件地址
   * outPath 输出文件地址
   * 规则:1.以字符串"商户交易明细"为一个子文件的开始标识
   *       2.规定前5行为文件头,原因是商户号在地五行
   *       3.文件名称为商户号+清算日期
   */
   def spilt(inPath:String,outPath:String) ={
     var isDeal:Boolean = false  //处理标识
     var lineNum:Int =0  //行计数器
     var isPrt:Boolean = false  //打印标识
     var topLines:List[String] = Nil  //记录文件头
     var writer:PrintWriter = null  //打印
     val read = Source.fromFile(inPath,"gbk")  //都入流,设定字符集为gbk
     read.getLines().foreach{ v =>//遍历整个文档
       if(v.trim.contains( "商户交易明细")){ isDeal = true ; isPrt =false }  //开闭
       if(isDeal){  //进入文件头处理
         lineNum += 1  //记录行数
         if(lineNum != 5) topLines = v::topLines  //记录文件头
         if(lineNum == 5){  //当文件头记完时,进行新文档的处理
           val merNo = v.replaceAll(" ","").substring(4,19)+v.replaceAll(" ","").substring(23,31)  //设定文件名称
           if(writer !=null)  writer.close()  //关闭上一个写入流
           writer = new PrintWriter(new File(outPath+merNo+".txt" ))  //新建一个写流
           isPrt =true  //开启打印
           topLines.reverse.foreach( a =>writer.println(a))  //将头部打印
           topLines = Nil  //将头文件记录清空
           isDeal =false  //关闭处理
           lineNum=0  //清零行数
         }
       }
       if(isPrt) writer.println(v)  //打印
     }
     if(writer !=null)  writer.close()  //关闭写入流
     read.close()  //关闭读入流
   }
 }

 

猜你喜欢

转载自see-you-again.iteye.com/blog/2291215
今日推荐