有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java解析txt文件

我必须写一个程序,将解析棒球运动员的信息和点击,出,走,从txt文件等。例如,txt文件可能如下所示: 萨姆·斯劳格,h,h,o,s,w,w,h,w,o,o,o,o,h,s 吉尔·詹克斯,哦,哦,s,h,h,o,o 威尔·琼斯,哦,哦,w,h,o,o,o,o,o,o,w,o,o,o

我知道如何解析文件,并且可以让代码完美运行。我唯一的问题是,我们应该只打印每个球员的名字和3或他们的比赛。例如: 萨姆击球手击球,击球,出局 吉尔·詹克斯出去,出去,牺牲飞行 琼斯会出去,出去,走吗

我不知道如何限制这一点,每次我试着在3点时切断它,我总是让第一个人工作得很好,但它打破了循环,对所有其他球员都没有任何作用

这就是我到目前为止所做的:

import java.util.Scanner;
import java.io.*;

public class ReadBaseBall{

public static void main(String args[]) throws IOException{

    int count=0;
    String playerData;
    Scanner fileScan, urlScan;

    String fileName = "C:\\Users\\Crust\\Documents\\java\\TeamStats.txt";
    fileScan = new Scanner(new File(fileName));

    while(fileScan.hasNext()){

        playerData = fileScan.nextLine();
        fileScan.useDelimiter(",");

        //System.out.println("Name: " + playerData);

        urlScan = new Scanner(playerData);
        urlScan.useDelimiter(",");


        for(urlScan.hasNext(); count<4; count++)

            System.out.print(" " + urlScan.next() + ",");

        System.out.println();

        }
    }
}

这将打印出: Sam Slugger,h,h,o, 但随后其他玩家被排除在外。我需要帮忙把其他的也打印出来


共 (4) 个答案

  1. # 1 楼答案

    第一个问题

    while(fileScan.hasNext()))更改为while(fileScan.hasNextLine())。这不是一个断裂问题,但当使用扫描仪时,你通常会把sc.*放在sc.has*后面

    第二个问题

    删除fileScan.useDelimiter(",")行。这一行在这种情况下不起任何作用,但会替换默认的分隔符,这样扫描器就不会在空白处拆分。这在使用Scanner.nextLine时并不重要,但在以后可能会有一些严重的副作用

    第三个问题

    将此行for(urlScan.hasNext(); count<4; count++)更改为while(urlScan.hasNext())。老实说,我很惊讶这行代码竟然被编译了,如果它编译了,它只能从扫描仪中读取前4行

    如果你想限制每行的处理量,你可以用

    for( int count = 0; count < limit && urlScan.hasNext( ); count++ )

    这会将读取量限制为limit,同时仍会处理数据少于限制的行

    确保每个数据集之间用一行隔开,否则输出可能没有多大意义

  2. # 2 楼答案

    在这里,使用FileReader试试这个 假设您的文件内容格式如下

     Sam Slugger,h,h,o,s,w,w,h,w,o,o,o,h,s
     Jill Johns,h,h,o,s,w,w,h,w,o,o,o,h,s
    

    每个球员都在自己的队伍中,这对你来说是可行的

     BufferedReader reader;
        try {
            reader = new BufferedReader(new FileReader(new File("file.txt")));
            String line = "";
            while ((line = reader.readLine()) != null) {
                String[] values_per_line = line.split(",");
                System.out.println("Name:" + values_per_line[0] + " "
                        + values_per_line[1] + " " + values_per_line[2] + " "
                        + values_per_line[3]);
                line = reader.readLine();
            }
            reader.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    

    否则,如果它们像一行一样排列在一起,那么就修改这个样本

     Sam Slugger,h,h,o,s,w,w,h,w,o,o,o,h,s| John Slugger,h,h,o,s,w,w,h,w,o,o,o,h,s
    
     BufferedReader reader;
        try {
            reader = new BufferedReader(new FileReader(new File("file.txt")));
            String line = "";
            while ((line = reader.readLine()) != null) {
                // token identifier is a space
                String[] data = line.trim().split("|");
                for (int i = 0; i < data.length; i++)
                    System.out.println("Name:" + data[0].split(",")[0] + " "
                            + data[1].split(",")[1] + " "
                            + data[2].split(",")[2] + " "
                            + data[3].split(",")[3]);
                line = reader.readLine();
            }
            reader.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    
  3. # 3 楼答案

    您需要在while循环中重置count汽车:

     while(fileScan.hasNext()){
            count = 0;
            ...
     }
    
  4. # 4 楼答案

    你不应该在这个问题上有多个扫描器——假设你在问题中发布的格式,你可以使用正则表达式来实现这一点

    这演示了一个正则表达式来匹配播放器,并用作扫描仪的分隔符。在我的例子中,我给扫描器输入了一个字符串,但不管来源如何,技术都是一样的

    int count = 0;
    Pattern playerPattern = Pattern.compile("\\w+\\s\\w+(?:,\\w){1,3}");
    Scanner fileScan = new Scanner("Sam Slugger,h,h,o,s,w,w,h,w,o,o,o,h,s Jill Jenks,o,o,s,h,h,o,o Will Jones,o,o,w,h,o,o,o,o,w,o,o");
    fileScan.useDelimiter("(?<=,\\w)\\s");
    
    while (fileScan.hasNext()){
        String player = fileScan.next();
        Matcher m = playerPattern.matcher(player);
        if (m.find()) {
            player = m.group(0);
        } else {
            throw new InputMismatchException("Players data not in expected format on string: " + player);
        }
        System.out.println(player);
        count++;
    }
    System.out.printf("%d players found.", count);
    

    输出:

    Sam Slugger,h,h,o
    Jill Jenks,o,o,s
    Will Jones,o,o,w
    

    Scanner.delimiter()的调用设置用于检索令牌的分隔符。正则表达式(?<=,\\w)\\s

    (?<                             // positive lookbehind
        ,\w                         // literal comma, word character
    )
    \s                              // whitespace character
    

    它通过条目之间的空格来划分玩家,除了空格之外,其他任何内容都不匹配,而且名字之间的空格也不匹配

    用于提取每个玩家最多3个剧本的正则表达式是^{

    \w+                             // matches one to unlimited word characters
    (?:                             // begin non-capturing group
        ,\w                         // literal comma, word character
    ){1,3}                          // match non-capturing group 1 - 3 times