java 文件格式解析JSON数据(其二)

个人用途使用,用于将文件解析成JSON格式。

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.epam.parso.Column;
import com.epam.parso.SasFileReader;
import com.epam.parso.impl.SasFileReaderImpl;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Component;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

    //省略类文件名,自己弄一下,以上为所有需要的包
    Logger logger=Logger.getLogger(Class.class);

    /**
     * @param file 需要解析的Sas文件
     * 这里获取数据
     * json数据格式 文件名.列名type:data  type为数据类型,自定义
     */
    public JSONArray readSas(File file,String filenames) {
        //获取数据集合
        List<Object[]> list = new ArrayList<>();
        //获取头部行数据
        List<String> header=new ArrayList<>();
        InputStream is=null;
        try {
            is=new FileInputStream(file);//将文件输入到流解析
            //创建SasFileReader类的变量,并指示包含SAS7BDAT文件的InputStream作为   
            //SasFileReader构造函数中的参数
            SasFileReader sasFileReader = new SasFileReaderImpl(is);
            //获取SAS7BDAT文件的属性
            sasFileReader.getSasFileProperties();
            //获得SAS7BDAT列的描述
            List<Column> next=sasFileReader.getColumns();
            //根据列类型判断使用什么方法解析数据
            for(Column temp:next) {
                String type=temp.getType().toString();
                if("Number".equals(type.substring(type.lastIndexOf(".")+1))){
                    header.add(temp.getName()+"01");
                }else{
                    header.add(temp.getName()+"00");
                }
            }
            int size = header.size();
            String headName=null;
            String type=null;
            //判断列名是否包含特殊字符,包含则自定义列名 第n列
            for(int i = 0; i < size; i++){
                headName=header.get(i).substring(0,header.get(i).length()-2).trim();
                if(headName.length() > 0){
                    if(!isLetterDigitOrChinese(headName.substring(0,1))){
                        type=header.get(i).substring(header.get(i).length()-2);
                        header.set(i,"第"+(i+1)+"列"+type);
                    }
                }else{
                    type=header.get(i).substring(header.get(i).length()-2);
                    header.set(i,"第"+(i+1)+"列"+type);
                }
            }
            Object[] data=null;
            //获取所有数据
            while((data=sasFileReader.readNext()) != null){
                //添加数据集合
                list.add(data);
            }
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            try{
                is.close() ;
            }catch (Exception e){
                e.printStackTrace();
                logger.trace("InputStream closure error");
            }
        }
        return readSasContent(list,header,filenames);
    }


    /**
     * 将读取出来的数据转换为Json
     * 这里定义json添加的key形式和data数据处理
     * @param list     数据集合
     * @param header   列名
     * @param fileName 文件名
     * @return
     */
    public JSONArray readSasContent(List<Object[]> list,List<String> header, 
                                    String fileName) {
        JSONArray resJson = new JSONArray();
        JSONObject jsonObj = null;

        int size = list.size();
        int cloumnSize = header.size();
        //循环处理每条数据
        for (int i = 0; i < size; i++) {
            jsonObj = new JSONObject(true);
            Object[] cellValue = list.get(i);
            //System.out.print(cellValue.length);
            for (int j = 0; j < cloumnSize; j++) {
                jsonObj.put(fileName + "." + header.get(j), cellValue[j]);
            }
            //System.out.println(jsonObj.toJSONString()); 打印数据,检查
            resJson.add(jsonObj);
        }
        //System.out.println(list.size());
        //System.out.println(resJson.size());
        //下面四行个人需要,看业务来
        JSONObject sasJson = new JSONObject();
        sasJson.put(fileName, resJson);
        JSONArray sasArr = new JSONArray();
        sasArr.add(sasJson);

        return sasArr;
    }

    /**
     * 判断是否包含字母或数字或中文  用于生成列名
     * @param str
     * @return
     */
    public boolean isLetterDigitOrChinese(String str) {
        String regex = "^[a-z0-9A-Z\u4e00-\u9fa5]+$";//其他需要,直接修改正则表达式就好
        return str.matches(regex);
    }

以下为特殊所需要的Jar包

      <dependency>
            <groupId>com.epam</groupId>
            <artifactId>parso</artifactId>
            <version>2.0</version>
        </dependency>

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值