* 拆分对账单 * * 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() //关闭读入流 } }