在开发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的属性关联赋值即可完成此功能。