一:问题描述
在我的博客文章https://blog.csdn.net/yezonghui/article/details/105665709里面详细介绍使用Excel进行数据分离,每行序列长度统计,长度数量计算,柱状图的绘制。在本文章中我们将采用Java编程来达到上述数据预处理的效果。
二:问题解决
1.数据的最初格式:
2.数据每行长度进行统计
思路:即判断一个字符串中整数的个数。(代码的注释中详细描述了统计方法)
/*
* 统计整理好的序列的长度。
* 即输出每行的长度。
*/
package temp;
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.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
public class test002 {
public static void WriteCSV2(File csv, StringBuffer sBuffer) {
BufferedWriter bw;
try {
bw = new BufferedWriter(new FileWriter(csv, true));
// 添加新的数据行
bw.write(new String(sBuffer));
bw.newLine();
bw.close();
} catch (IOException e) {
e.printStackTrace();
} // 附加
}
public static void ReadCSV2(FileReader fr){
try {
BufferedReader reader = new BufferedReader(fr);
int index = 0;
//reader.readLine(); //因为我们的csv文件的第一列有列属性(即列名称)
String line = null;
String flag="-1"; //作为一个标志,即上一行的第一列数值的值(
//没有后续判断当前行与上一行是否相等的作用,只起到启动第一行的作用)
StringBuffer all=new StringBuffer();
StringBuffer all2 = new StringBuffer();
StringBuffer all3 = new StringBuffer();
StringBuffer stringshuzi = new StringBuffer();
//StringBuffer templine = new StringBuffer();
String templine ="";
String lastUserId=""; //初始化为空
int count=0;
// Map<String, List<String>> map1=new HashMap<>();
Map<String, String> map=new HashMap<>();
List<Integer> list=new ArrayList<Integer>();
List<Integer> list2 = new ArrayList<Integer>();
//System.out.println("输出通过list处理后的数据:");
while(((line=reader.readLine())!=null)){
boolean isChar = false;
/*
* 判断一行字符串中整数的个数?
* 思路:对于一行来说,一个个向后走,判断当前的是否在数字0到9之间;
* 继续判断这个数字之后是空格还是数字0到9之间的数字,如果是数字加两个数字合并,继续找下去
* [注意1]这里是找整数不是单纯地找某一个数字
* [注意2]最后一个位置要进行单独的处理,因为如果最后一个位置是数字的话也要添加进去。
*/
//while(((line=reader.readLine())!=null)&&(index<100)){
templine = line;
for(int i = 0; i<templine.length();i++) {
char c = templine.charAt(i);
if(c >='0' && c<= '9') {
stringshuzi.append(templine.charAt(i));
if(i==templine.length()-1) {
list.add(Integer.parseInt(stringshuzi.toString()));
stringshuzi.setLength(0);
}
isChar = false;
/*
* Integer.parseInt(s)的作用就是把字符串s解析成有符号的int基本类型。
* 该对象的字符串表示。通常, toString 方法会返回一个“以文本方式表示”此对象的字符串
*/
}else {
if(stringshuzi.length()> 0 && isChar == false) {
list.add(Integer.parseInt(stringshuzi.toString()));
stringshuzi.setLength(0);
}
isChar = true;
}
}
//System.out.println(list.size());
list2.add(list.size());
//System.out.println("输出list2内容:");
//System.out.println(list2);
list.clear();
all.append(line);
WriteCSV2(new File("test002.txt"),all);
all.setLength(0);
index++;
System.out.println(line);
String item[] = line.split(",");//CSV格式文件为逗号分隔符文件,这里根据逗号切分
}
System.out.println("请输出list2所有的护具即长度");
Collections.sort(list2);
/*
* 如何对文件里面的数据排序?
*/
BufferedWriter bw2 = new BufferedWriter(new FileWriter("test0022.txt"));
//BufferedWriter bw2 = new BufferedWriter(new FileWriter("test002.csv"));
/*
* 将排好序的数据写入文件了。
* 总结好数据类型转换,文件读写等。
*/
for(int k : list2) {
//String copy = String.ValueOf(k);
String copy = Integer.toString(k);
bw2.write(copy);
bw2.newLine();
bw2.flush();
/*
* 错误:在控制台可以打印信息,但是写不进txt文本
原因:没有及时 flush() ,
BufferedWriter是缓冲输入流,意思是调用BufferedWriter的write方法时候。
数据是先写入到缓冲区里,并没有直接写入到目的文件里。
必须调用BufferedWriter的flush()方法。这个方法会刷新一下该缓冲流,
也就是会把数据写入到目的文件里。或者你可以调用BufferedWriter的close()方法,
该方法会在关闭该输入流之前先刷新一下该缓冲流。也会把数据写入到目的文件里。
*/
}
bw2.close();
//System.out.println(list2);
all2.append(toString(list2,' '));
// WriteCSV2(new File("test0021.txt"),all2);
/* int size = list2.size();
String[] array = (String[]) list2.toArray(new String[size]);
BufferedWriter bw2 = new BufferedWriter(new FileWriter("test0022.txt"));
for(String k : array) {
bw2.write(k);
bw2.newLine();
bw2.flush();*/
//all3.append(array);
// list2 = list2.toString();
//for(String k : all3){
// WriteCSV2(new File("test0022.txt"),k);
//WriteCSV2(new File("test0022.txt"),k.toString());
//}
//bw2.close();
/* for(int j =0 ;j<list2.size(); j++)
{
all2.append(toString(list2,' '));
// WriteCSV2(new Fi