解析txt文件

时间:2015-04-24 03:56:30

标签: java parsing loops

我必须编写一个程序来解析棒球运动员信息,然后从txt文件中点击,外出,走路等。例如,txt文件可能如下所示: 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

我知道如何解析文件并且可以使代码运行完美。我唯一的问题是我们应该只打印每个玩家的名字和3或他们的游戏。例如: Sam Slugger击中,击中,击出 Jill Jenks出去,出去,牺牲苍蝇 琼斯会出去走出去吗

我不确定如何限制这一点,每次我尝试在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 个答案:

答案 0 :(得分:1)

在这里,使用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();
    }

答案 1 :(得分:0)

第一个问题

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 :(得分:0)

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

 while(fileScan.hasNext()){
        count = 0;
        ...
 }

答案 3 :(得分:0)

您不应该有多个扫描程序 - 假设您在问题中发布的格式,您可以使用正则表达式来执行此操作。

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

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+\\s\\w+(?:,\\w){1,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