有时候导入txt文件不一定是采用分隔符方式导入,而是采用按字节、字符长度导入,比如银联对账文件。


导入txt数据


姓名 年龄科目分数

陈寻  12语文67

王老五12语文80

柯景腾13语文78

沈佳宜14语文88

王小贱15语文60

黄小仙12语文54

李大仁14语文76

程又青13语文58

方茴  12语文87

沈晓棠13语文89

林嘉茉14语文68

赵烨  14语文50

苏凯  12语文78

乔燃  13语文90


我们采用iso8859-1单字节编码读取文件数据,一个汉字占2字节。


导入demo

package example;


import java.io.File;

import java.io.FileInputStream;

import java.util.List;

import java.util.Map;


import model.Student;

import test.AbstractTxtTest;


import com.easyReport.read.checker.GEValuePropertyChecker;

import com.easyReport.read.checker.LEValuePropertyChecker;

import com.easyReport.read.checker.PropertyChecker;

import com.easyReport.read.temp.ReadTemp;

import com.easyReport.read.temp.TxtBytePropertyTemp;

import com.easyReport.read.temp.TxtReadTemp;


public class TestTxtByte extends AbstractTxtTest<Student> {

@Override

public void test() {

FileInputStream fileInputStream;

try {

fileInputStream = new FileInputStream(new File("testFile/test7.txt"));

testReadBean(fileInputStream);

// testReadMap(fileInputStream);

fileInputStream.close();

} catch (Exception e) {

e.printStackTrace();

}

}


@Override

protected ReadTemp bulidReadTemp() {

//模板批次设置构造方法,一次读取10行

TxtReadTemp readTemp = new TxtReadTemp(1,10);

readTemp.setEncode("iso8859-1");

readTemp.addPropertyTemp(new TxtBytePropertyTemp("姓名", "name",0,6));

readTemp.addPropertyTemp(new TxtBytePropertyTemp("年龄", "age",6,8));

readTemp.addPropertyTemp(new TxtBytePropertyTemp("科目", "course.name",8,12));

//大于等于60小于等于80

readTemp.addPropertyTemp(new TxtBytePropertyTemp("分数", "course.score",new PropertyChecker[]{

new GEValuePropertyChecker(60),new LEValuePropertyChecker(80)

},12,14));

return readTemp;

}


@Override

protected void writeBeanList(List<Student> modelLists) {

System.out.println("--------------bean---------------");

for (Student s : modelLists) {

System.out.println(s.getName() + "|"

+ s.getAge()+s.getCourse().getName()+"|"+s.getCourse().getScore());

}

}


@Override

protected void writeMapList(List<Map<String, Object>> mapLists) {

System.out.println("--------------map---------------");

for (Map<String, Object> m : mapLists) {

System.out.println(m.get("name") + "|" + m.get("age")+"|" + m.get("course.name")+"|" + m.get("course.score"));

}

}


}

导入模板见红色字体部分,我们设置编码为iso8859-1,读取文件将按照设置编码输入流读取,同事使用TxtBytePropertyTemp属性模板设置读起始位置等。

运行结果:

--------------bean---------------

陈寻|12语文|67.0

王老五|12语文|80.0

柯景腾|13语文|78.0

王小贱|15语文|60.0

李大仁|14语文|76.0

--------------bean---------------

林嘉茉|14语文|68.0

苏凯|12语文|78.0

第5行,分数值必须小于等于80.0;

第7行,分数值必须大于等于60.0;

第9行,分数值必须大于等于60.0;

第10行,分数值必须小于等于80.0;

第11行,分数值必须小于等于80.0;

第13行,分数值必须大于等于60.0;

第15行,分数值必须小于等于80.0;


我们也可以采用按字符长度读取文件。

导入数据我们做修改,姓名使用3字符长度。

姓名 年龄科目分数

陈寻 12语文67

王老五12语文80

柯景腾13语文78

沈佳宜14语文88

王小贱15语文60

黄小仙12语文54

李大仁14语文76

程又青13语文58

方茴 12语文87

沈晓棠13语文89

林嘉茉14语文68

赵烨 14语文50

苏凯 12语文78

乔燃 13语文90


导入demo

package example;


import java.io.File;

import java.io.FileInputStream;

import java.util.List;

import java.util.Map;


import model.Student;

import test.AbstractTxtTest;


import com.easyReport.read.checker.GEValuePropertyChecker;

import com.easyReport.read.checker.LEValuePropertyChecker;

import com.easyReport.read.checker.PropertyChecker;

import com.easyReport.read.temp.ReadTemp;

import com.easyReport.read.temp.TxtBytePropertyTemp;

import com.easyReport.read.temp.TxtReadTemp;


public class TestTxtByte extends AbstractTxtTest<Student> {

@Override

public void test() {

FileInputStream fileInputStream;

try {

fileInputStream = new FileInputStream(new File("testFile/test7.txt"));

testReadBean(fileInputStream);

// testReadMap(fileInputStream);

fileInputStream.close();

} catch (Exception e) {

e.printStackTrace();

}

}


@Override

protected ReadTemp bulidReadTemp() {

//模板批次设置构造方法,一次读取10行

TxtReadTemp readTemp = new TxtReadTemp(1,10);

/* readTemp.setEncode("iso8859-1");

readTemp.addPropertyTemp(new TxtBytePropertyTemp("姓名", "name",0,6));

readTemp.addPropertyTemp(new TxtBytePropertyTemp("年龄", "age",6,8));

readTemp.addPropertyTemp(new TxtBytePropertyTemp("科目", "course.name",8,12));

//大于等于60小于等于80

readTemp.addPropertyTemp(new TxtBytePropertyTemp("分数", "course.score",new PropertyChecker[]{

new GEValuePropertyChecker(60),new LEValuePropertyChecker(80)

},12,14));*/

readTemp.addPropertyTemp(new TxtBytePropertyTemp("姓名", "name",0,3));

readTemp.addPropertyTemp(new TxtBytePropertyTemp("年龄", "age",3,5));

readTemp.addPropertyTemp(new TxtBytePropertyTemp("科目", "course.name",5,7));

//大于等于60小于等于80

readTemp.addPropertyTemp(new TxtBytePropertyTemp("分数", "course.score",new PropertyChecker[]{

new GEValuePropertyChecker(60),new LEValuePropertyChecker(80)

},7,9));

return readTemp;

}


@Override

protected void writeBeanList(List<Student> modelLists) {

System.out.println("--------------bean---------------");

for (Student s : modelLists) {

System.out.println(s.getName() + "|"

+ s.getAge()+s.getCourse().getName()+"|"+s.getCourse().getScore());

}

}


@Override

protected void writeMapList(List<Map<String, Object>> mapLists) {

System.out.println("--------------map---------------");

for (Map<String, Object> m : mapLists) {

System.out.println(m.get("name") + "|" + m.get("age")+"|" + m.get("course.name")+"|" + m.get("course.score"));

}

}


}

没有设置编码,默认采用GBK编码。

运行结果:

--------------bean---------------

陈寻|12语文|67.0

王老五|12语文|80.0

柯景腾|13语文|78.0

王小贱|15语文|60.0

李大仁|14语文|76.0

--------------bean---------------

林嘉茉|14语文|68.0

苏凯|12语文|78.0

第5行,分数值必须小于等于80.0;

第7行,分数值必须大于等于60.0;

第9行,分数值必须大于等于60.0;

第10行,分数值必须小于等于80.0;

第11行,分数值必须小于等于80.0;

第13行,分数值必须大于等于60.0;

第15行,分数值必须小于等于80.0;