我正在编写一个程序来读取各种类型数据的文件。我正在尝试将文件中的数据传递给我创建的各种数组。
文件中的样本部分(换行符为双倍行距。类别之间的空格为制表符,但名字/姓氏和国家/地区之间的空格为空格)
Name Age Country Year Closing Date Sport Gold Silver Bronze Total
Joe Max 24 Algeria 2012 8/12/2012 Athletics 1 0 0 1
Tom Lan 27 United States 2008 8/24/2008 Rowing 0 1 0 1
但是,当我的代码编译时,我得到了InputMismatchException。我想知道它是否涉及这样一个事实:在每一行的末尾,没有随后的标签。任何人都可以帮我解决这个问题吗?
public static void main(String[] args) {
Scanner console = new Scanner(System.in);
intro();
Scanner input1 = null;
Scanner input2 = null;
int lineCount = 0;
try {
input1 = new Scanner(new File("olympicstest.txt"));
}
catch (FileNotFoundException e) {
System.out.println("Invalid Option");
System.exit(1);
}
while (input1.hasNextLine()) {
lineCount++;
input1.nextLine();
}
lineCount = lineCount - 1;
String[] country = new String[lineCount];
int[] totalMedals = new int[lineCount];
String[] name = new String[lineCount];
int[] age = new int[lineCount];
int[] year = new int[lineCount];
String[] sport = new String[lineCount];
try {
input2 = new Scanner(new File("olympicstest.txt"));
input2.useDelimiter("\t");
}
catch (FileNotFoundException e) {
System.out.println("Invalid Option"); // not sure if this line is needed
System.exit(1); // not sure if this line is needed
}
String lineDiscard = input2.nextLine();
for (int i = 0; i < lineCount; i++) {
name[i] = input2.next();
age[i] = input2.nextInt();
country[i] = input2.next();
year[i] = input2.nextInt();
input2.next(); // closing ceremony date
sport[i] = input2.next();
input2.nextInt(); // gold medals
input2.nextInt(); // silver medals
input2.nextInt(); // bronze medals
totalMedals[i] = input2.nextInt();
}
}
答案 0 :(得分:1)
是的,你对导致问题的原因是对的。解决方案是在useDelimiter
调用中使用正则表达式,该调用接受制表符和换行符。所以你会这样做:
input2.useDelimiter("[\t\n]");
答案 1 :(得分:1)
是的,当你设置一个特定的分隔符时,不幸的是,它成为唯一用于分隔与你的.next()
语句不能很好匹配的值的分隔符,因此你可以添加标签(\t
)到每行的末尾,或者您可以将\t
和\n
设置为带有正则表达式"[\t\n]"
的分隔符。我也更喜欢使用CSV格式,并用逗号分隔所有值,因为标签和空白字符通常不能从视觉角度区分,因此我发现以后更容易使用/格式化