程序讲解:
- 需要被读取的csv文件中要
手动添加
一行数据,个数和内容个数一样。如图tempReaderCsv.csv文件第一行(1,2,3,4,5)。该操作原因请看代码注解。 - 代码逻辑写死了列名
sum
和soldNum
,因为代码中的写文件是需要总量和售货量作为参照的。 - 功能:筛选出售货量不达标的数据输出到一个新csv文件里,再追加两列
剩余量
和售货率
- 很简单,
目的
是提供一个模板供大家进行文件读写的代码理解或者进行文件读写其他功能的开发。 - 欢迎评论私信
package tempExample;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.text.DecimalFormat;
//author @ZoHing
public class readerWriterCsv {
/**
* 读文件
*/
public void fileReader() {
//先获取文件的路径,通过BufferedReader类去读该路径中的文件
File filePath = new File("E:\\temp\\tempReaderCsv.csv");
try{
//通过BufferedReader类新建字符输入流对象
BufferedReader readerStream = new BufferedReader(new FileReader(filePath));
String lineData = "";
int index = 1;
int targetSum = 0;
int targetsoldNum = 0;
int Substandard = 0;
String SubstandardFileWriterDataString = null;
//需要给文件首行加上对应列数,作用: 代码里需要取文件里列数,但是字符输入流赋值给其他变量后
//赋值给变量的那段文件数据在字符输入流中就不存在了。
String TempLineData = readerStream.readLine();
String[] tempDataStrings = TempLineData.split(",");
String[] SubstandardFileWriterData = new String[tempDataStrings.length];
System.out.println("this data's length:" + tempDataStrings.length);
//将文档的下一行数据赋值给lineData,并判断是否为空,若不为空则输出
//readLine()解释:
//读一行文字。换行符(“\n”)、回车(“\r”)、换行符后面紧跟换行符的回车符或到达文件末尾的任意一个都会将一行视为终止
//返回一个包含行内容的字符串,不包括任何行终止字符,如果在未读取任何字符的情况下到达流的结尾,则返回null
while ((lineData = readerStream.readLine()) != null){
String[] tempData = lineData.split(",");
if(index == 1 && index!=0) {
for(int i=0;i<tempData.length;i++) {
//( equals )比较两个对象的内容是否相等,此处不能用( == )
if(tempData[i].equals("sum")) {
targetSum = i;
} else if(tempData[i].equals("soldNum")){
targetsoldNum = i;
}
}
} else {
//除法设置保留位数
DecimalFormat df=new DecimalFormat("0.00");
//筛选出售货量不及格的商品数据
if(Float.parseFloat(df.format((float)Integer.parseInt(tempData[targetsoldNum])/Integer.parseInt(tempData[targetSum]))) < 0.6f) {
System.out.println("Substandard data:"+lineData);
//将不及格数据放入新String[]中
SubstandardFileWriterDataString = lineData;
SubstandardFileWriterData[Substandard] = SubstandardFileWriterDataString;
Substandard++;
}
}
index++;
}
//SubstandardFileWriterData[]:csv一整行作为一个字符串占一个数组长度
//Substandard:不达标的整行数据个数
SubstandardFileWriter(SubstandardFileWriterData,Substandard,targetSum,targetsoldNum);
readerStream.close();
}catch (FileNotFoundException e){
System.out.println("没有找到指定文件");
}catch (IOException e){
System.out.println("文件读写出错");
}
}
/**
* 输出不合格数据到csv文件
*
* @param str 字符串数组
* @param index 需要输出的个数
* @param sum 总量位于的列数
* @param soldnum 售货量位于的列数
*/
public void SubstandardFileWriter(String[] str,int index,int sum,int soldnum) {
File filePath = new File("E:\\temp\\tempSubstandardFile.csv");
try{
//新建一个字符输出流对象
BufferedWriter writeStream = new BufferedWriter(new FileWriter(filePath));
System.out.println("Substandard data hava:"+index);
writeStream.write("The Substandard Data:");
//换行
writeStream.newLine();
writeStream.write("name,id,price,sum,soldNum"+",reminder,soldPercent");
writeStream.newLine();
for(int i=0;i<index;i++) {
DecimalFormat df=new DecimalFormat("0.00");
String[] tempDataStrings = str[i].split(",");
int reminder = Integer.parseInt(tempDataStrings[sum])-Integer.parseInt(tempDataStrings[soldnum]);
float soldPercent = Float.parseFloat(df.format((float)Integer.parseInt(tempDataStrings[soldnum])/Integer.parseInt(tempDataStrings[sum])));
writeStream.write(str[i] + "," + reminder + "," + soldPercent);
writeStream.newLine();
}
//使用缓冲区的刷新方法将数据刷到目的地中
writeStream.flush();
//关闭缓冲区,缓冲区没有调用系统底层资源,真正调用底层资源的是FileWriter对象,缓冲区仅仅是一个提高效率的作用
//因此,此处的close()方法关闭的是被缓存的流对象
writeStream.close();
}catch (FileNotFoundException e){
System.out.println("没有找到指定文件");
}catch (IOException e){
System.out.println("文件读写出错");
}
}
public static void main(String[] args) {
readerWriterCsv readercsv = new readerWriterCsv();
readercsv.fileReader();
}
}
tempReaderCsv.csv文件:
1,2,3,4,5
name,id,price,sum,soldNum
chicken,1001,54,95,67
duck,2002,69,105,89
fish,3003,35,108,102
sheep,4004,485,12,3
pig,5005,302,9,4
运行结果:
tempSubstandardFile.csv文件: