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, 但随后其他玩家被排除在外。我需要帮忙把其他的也打印出来
# 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 楼答案
在这里,使用FileReader试试这个 假设您的文件内容格式如下
每个球员都在自己的队伍中,这对你来说是可行的
否则,如果它们像一行一样排列在一起,那么就修改这个样本
# 3 楼答案
您需要在while循环中重置
count
汽车:# 4 楼答案
你不应该在这个问题上有多个扫描器——假设你在问题中发布的格式,你可以使用正则表达式来实现这一点
这演示了一个正则表达式来匹配播放器,并用作扫描仪的分隔符。在我的例子中,我给扫描器输入了一个字符串,但不管来源如何,技术都是一样的
输出:
对
Scanner.delimiter()
的调用设置用于检索令牌的分隔符。正则表达式(?<=,\\w)\\s
:它通过条目之间的空格来划分玩家,除了空格之外,其他任何内容都不匹配,而且名字之间的空格也不匹配
用于提取每个玩家最多3个剧本的正则表达式是^{: