数据分析-数据预处理-完成数据统计的柱状图的绘制(Java版本)

本文介绍了如何使用Java进行数据预处理,包括数据每行长度统计、长度数量计算,以及借助JFreeChart库绘制柱状图。详细讲解了Java读取文件、BufferedReader与BufferedWriter的使用,以及如何配置和使用JFreeChart库来生成柱状图。
摘要由CSDN通过智能技术生成

一:问题描述

       在我的博客文章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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值