Android 读取csv文件并转换为java bean

在开发android读取csv文件时,在网上翻来翻去并没有找到一个合适的工具包,然后自己就花了半个小时写了一个。废话不多说,上代码。

代码并没有做特殊错误处理,或许有很多欠缺的地方,大家可以参考参考,自己完善。

CsvReader.java

package top.latestwin.osa.common.csv;/*
import java.io.*;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.nio.charset.Charset;
import java.util.*;

/**
 * @author jinxin_itmaster@163.com
 * Created by Administrator on 2019/9/23 0023.
 */
public class CsvReader {

    private static CsvReader instance = null;

    public static CsvReader getInstance(String separator,String charset) {
        if (instance == null) {
            instance = new CsvReader();
        }
        instance.CHARSET = charset;
        instance.SEPARATOR = separator;
        return instance;
    }

    private CsvReader () {}


    private String SEPARATOR  = ",";

//    public static final String CHARSET = "UTF-8";
    private  String CHARSET = "GBK";

    public  <T> List<T> getData(String filepath ,Class<T> clazz) throws Exception
    {
        Map<Integer, Field> map = new HashMap<>();
        List<String[]> list = getRowsData(filepath);
        String[] header = list.get(0);
        List<String> headerList = Arrays.asList(header);

        List<T> result = new ArrayList<>();
        T obj;



        Field[] fields = clazz.getDeclaredFields();
        for (Field field : fields) {
            CsvField csvField = field.getAnnotation(CsvField.class);
            if (csvField != null) {
                String name = csvField.name();
                int headerIndex = headerList.indexOf(name);
                if (headerIndex != -1) {
                    map.put(headerIndex, field);
                }
            }
        }

        for (int i = 1; i < list.size(); i++) {
            obj = clazz.newInstance();
            String[] rows = list.get(i);
            for (int j = 0; j < rows.length; j++) {
                if (map.containsKey(j)) {
                    Field field = map.get(j);
                    String fieldName = field.getName();
                    Class<?> fieldType = field.getType();
                    String typeString = fieldType.toString();
                    Method method = clazz.getMethod("set" + getFirstUpperCase(fieldName), fieldType);

                    if (typeString.endsWith("int")||typeString.endsWith("Integer")) {
                        //int值
                        method.invoke(obj, Integer.valueOf(rows[j]));
                    }
                    if (typeString.endsWith("long") || typeString.endsWith("Long")) {
                        method.invoke(obj, Long.valueOf(rows[j]));
                    }
                    if (typeString.endsWith("boolean") || typeString.endsWith("Boolean")) {
                        method.invoke(obj, Boolean.valueOf(rows[j]));
                    }
                    if (typeString.endsWith("char") || typeString.endsWith("Character")) {
                        method.invoke(obj, rows[j].charAt(0));
                    }
                    if (typeString.endsWith("String") ) {
                        method.invoke(obj, rows[j]);
                    }
                }
            }
            result.add(obj);
        }
        return result;
    }

    private  List<String[]> getRowsData(String filepath) {
        File file = new File(filepath);
        List<String[]> rows = new ArrayList<>();
        BufferedReader br = null;

        try {
             br = new BufferedReader(new InputStreamReader(new FileInputStream(file),Charset.forName(CHARSET)));
            String line = null;
            while ((line = br.readLine()) != null) {
                String[] row = line.split(SEPARATOR);
                rows.add(row);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if (br != null) {
                try {
                    br.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return rows;

    }

    private   String getFirstUpperCase(String fieldName) {
        char[] chars = fieldName.toCharArray();
        String s = String.valueOf(chars[0]).toUpperCase();
        chars[0] = s.toCharArray()[0];
        return new String(chars);
    }
}

CsvField.java

package top.latestwin.osa.common.csv;/*
import java.lang.annotation.*;

/**
 * @author jinxin_itmaster@163.com
 * Created by Administrator on 2019/9/23 0023.
 */
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface CsvField {
    String name() ;
}

CsvField 注解是为了标记Java bean对象的字段名称的。其中name()属性是CSV文件里的头部字段。

例如:

SysUser.java

package top.latestwin.osa.common.model;

import com.raizlabs.android.dbflow.annotation.Column;
import com.raizlabs.android.dbflow.annotation.PrimaryKey;
import com.raizlabs.android.dbflow.annotation.Table;
import com.raizlabs.android.dbflow.structure.BaseModel;

import top.latestwin.osa.app.Osa;
import top.latestwin.osa.common.csv.CsvField;

@Table(name = "sys_user", database = Osa.class)
public class SysUser extends BaseModel {
    @Column(name = "user_id", length = 20)
    @PrimaryKey
    @CsvField(name = "userId")
    private Long userId;

    @CsvField(name = "dept_id")
    @Column(length = 20,name = "dept_id")
    private Long deptId;

    @CsvField(name = "login_name")
    @Column(name = "login_name",length = 30)
    private String loginName;

    @CsvField(name = "user_name")
    @Column(length = 30,name = "user_name")
    private String userName;

    @CsvField(name = "user_type")
    @Column(length = 2,name = "user_type")
    private String userType;

    @CsvField(name = "password")
    @Column(length = 50)
    private String password;

    @CsvField(name = "salt")
    @Column(length = 20)
    private String salt;

    @CsvField(name = "status")
    @Column(length = 1)
    private Character status;

    @CsvField(name = "del_flag")
    @Column(length = 1,name = "del_flag")
    private Character delFlag;

    public Long getUserId() {
        return userId;
    }

    public void setUserId(Long userId) {
        this.userId = userId;
    }

    public Long getDeptId() {
        return deptId;
    }

    public void setDeptId(Long deptId) {
        this.deptId = deptId;
    }

    public String getLoginName() {
        return loginName;
    }

    public void setLoginName(String loginName) {
        this.loginName = loginName;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getUserType() {
        return userType;
    }

    public void setUserType(String userType) {
        this.userType = userType;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getSalt() {
        return salt;
    }

    public void setSalt(String salt) {
        this.salt = salt;
    }

    public Character getStatus() {
        return status;
    }

    public void setStatus(Character status) {
        this.status = status;
    }

    public Character getDelFlag() {
        return delFlag;
    }

    public void setDelFlag(Character delFlag) {
        this.delFlag = delFlag;
    }

    @Override
    public String toString() {
        return "SysUser{" +
                "userId=" + userId +
                ", deptId=" + deptId +
                ", loginName='" + loginName + '\'' +
                ", userName='" + userName + '\'' +
                ", userType='" + userType + '\'' +
                ", password='" + password + '\'' +
                ", salt='" + salt + '\'' +
                ", status=" + status +
                ", delFlag=" + delFlag +
                '}';
    }
}

CSV文件样式

在这里插入图片描述
CSVReader的调用方法:

List<SysUser> data = CsvReader
                    .getInstance(",","UTF-8")
                    .getData(“/tmp/user.csv”, SysUser.class);
                   

首先将文件的内容从csv文件里读取出来,然后将读取出来的内容使用Java反射技术,将内容和java bean的属性关联赋值即可完成此功能。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值