轻松掌握Java按行读取数据内容,并在该行末尾加上总成绩并写到新的文件中(包含正则表达式的求法)

现有如下格式的成绩单(文本格式)grate.txt:

姓名:马超,数学101分,英语120分,理综280
姓名:韩信,数学120分,英语130分,理综300
姓名:猴子,数学100分,英语145分,理综290

要求:
按行读入取成绩单,并在该行的最尾部加上该同学的总成绩,然后再将该行写入到一个名字为grates.txt的文件中

在这里插入图片描述

代码实现

方法①:

package lei;

import java.io.*;

public class dahfcbdcj {
      public static void main(String[] args) {
       File file=new File("c:\\javas\\grate.txt");
          File file1=new File("c:\\javas\\kk\\grates.txt");
          Students s=new Students();
          s.read(file,file1);
   }
}

class Students{
    String str=null;
    BufferedReader r;
    BufferedWriter w;
    public void read(File file,File file1){
        try{
            r=new BufferedReader(new FileReader(file));
            w=new BufferedWriter(new FileWriter(file1));
            while((str=r.readLine())!=null){
                double j=0,k=0;
                char[] a=str.toCharArray();
                for(int i=0;i<str.length();i++){
                    if(a[i]>='0'&&a[i]<='9'){//这里的0——9表示的是ASSIC码表中的,0的ASSIC码值为48
                        j=(double)(a[i]-48);
                        i++;
                        if(a[i]>='0'&&a[i]<='9'){
                            j=j*10+(double)(a[i]-48);
                            i++;
                        }
                        if(a[i]>='0'&&a[i]<='9'){
                            j=j*10+(double)(a[i]-48);
                        }
                        k+=j;
                    }else{
                        j=0;
                    }
            }
                String s1=str+"-------------总分"+k+"分";
                System.out.println(s1);
                w.write(s1);
                w.newLine();
            }
            w.close();
            r.close();
        }catch(IOException e){

        }
    }
}
方法②:

public class dahfcbdcj2 {
      public static void main(String[] args) {
       File file=new File("c:\\javas\\grate.txt");
          File file1=new File("c:\\javas\\kk\\grates.txt");
          Students2 s=new Students2();
          s.read(file,file1);
   }
}


class Students2{
    String str=null;
    BufferedReader r;
    BufferedWriter w;
    public void read(File file,File file1){
        try{
            r=new BufferedReader(new FileReader(file));
            w=new BufferedWriter(new FileWriter(file1));
            while((str=r.readLine())!=null){
                double r=0;
                char[] a=str.toCharArray();
                for(int i=0;i<str.length();i++){
                 double j = 0 ;
                 while(a[i]>='0'&&a[i]<='9') {
                  j=j*10+(double)(a[i]-48);
                        i++;
                 }
                 r += j ;
                }
                String s1=str+"-------------总分"+r+"分";
                System.out.println(s1);
                w.write(s1);
                w.newLine();
            }
            w.close();
            r.close();
        }catch(IOException e){

        }
    }
}
方法三:使用正则表达式进行求法:

public class dafgsfhfjkdhfuksd {
  public static void main(String[] args) throws IOException {
   File file=new File("c:\\javas\\grate.txt");
      File file1=new File("c:\\javas\\kk\\grates.txt");
      BufferedReader br = new BufferedReader( new FileReader(file));
      BufferedWriter bw = new BufferedWriter( new FileWriter(file1));
      String str = null ;
      while ( ( str = br.readLine() ) != null ) {
       double scores = StudentScore.totalScore(str);
       str = str + "总成绩:" + scores ;
       System.out.println(str);
       bw.write(str);
       bw.newLine();
      }
      br.close();
      bw.close();
  }
}
class StudentScore{
 public static double totalScore(String s) {
  String regex = "[^0123456789]";//正则表达式,[^0123456789]相当于[^0-9]
  String digitMess = s.replaceAll(regex, "*");
  StringTokenizer  st  =  new  StringTokenizer(digitMess,"*");
  double scores = 0;
  while(st.hasMoreTokens()) {
   double score = Double.parseDouble(st.nextToken());
   scores += score;
  }
  return scores;
 }
}
说明:

 StringTokenizer 位于java.util.StringTokenizer包中
string tokenizer 类允许应用程序将字符串分解为标记。tokenization 方法比 StreamTokenizer 类所使用的方法更简单。
StringTokenizer 方法不区分标识符、数和带引号的字符串,它们也不识别并跳过注释。 

hasMoreTokens()  测试此 tokenizer 的字符串中是否还有更多的可用标记。----- boolean

nextToken()  返回此 string tokenizer 的下一个标记。------String

想要了解该方法的更多内容可以自行查询API文档

方法四:使用split方法进行分割

import java.io.*;
public class I_O {
   public static void main(String[] args) throws IOException {
    BufferedReader br = new BufferedReader( new FileReader( "c:\\javas\\grate.txt" ));
    BufferedWriter bw = new BufferedWriter( new FileWriter( "c:\\javas\\kk\\ooooo.txt",true));
    String str = null ;
    while( (str=br.readLine())!=null ) {
     String [] s = str.split(",") ;//使用逗号进行分割
     int k = 0 , sum = 0 ;
     for(String a : s ) {
      if(k>=1&&k<=3) {
       String b =a.substring(2,5);//根据下标获取字符串中的数字
       //int c = Integer.valueOf(b);//转换为int类型
       int c = Integer.parseInt(b);//转换为int类型
       //System.out.println(c);此语句可进行验证,验证是否能够进行正常的输出
       sum += c ;
      }
      k++;
     }
//     char [] ch = new char [1024];
     bw.write(str+"-------------总分"+sum+"分");
     bw.newLine();//换行
     bw.flush();
    }
    bw.close();
    br.close();
   }
}

在这里插入图片描述
补充方法——正则表达式:
在这里插入图片描述
在这里插入图片描述

  • 4
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱睡觉的小馨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值