我必须编写一个程序来解析棒球运动员信息,然后从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, 但随后其他球员被排除在外。我需要帮助才能让其他人打印出来。
答案 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