【问题标题】:Separate comma delimited text file to array将逗号分隔的文本文件分隔到数组
【发布时间】:2019-03-10 08:22:09
【问题描述】:

我有一个包含多行的文本文件,每行 3 个逗号分隔的条目。

例子:

苏联,Larisa_LATYNINA,18
美国,Michael_PHELPS,16
苏联,Nikolay_ANDRIAOV,15

我试图将它们分成 3 个数组,其中 1 个代表国家,1 个代表个人,1 个代表奖牌。

        ArrayList<String> country = new ArrayList<>();
        ArrayList<String> name = new ArrayList<>();
        ArrayList<Integer> medals = new ArrayList<>();
        java.io.File file = new java.io.File("Olympics.txt");
        Scanner input = new Scanner(file);
        input.useDelimiter(" , ");
        while(input.hasNext()) {
            country.add(input.next());
            name.add(input.next());
            medals.add(input.nextInt());
        }

但每次我尝试运行它时都会出错。我不完全确定如何将文件中的每个“列”分成它们自己的数组。

如果我使用 useDelimiter(","); 而不是 useDelimiter(" , "); 我会收到以下异常:

Exception in thread "main" java.util.InputMismatchException
at java.base/java.util.Scanner.throwFor(Scanner.java:939)
at java.base/java.util.Scanner.next(Scanner.java:1594)
at java.base/java.util.Scanner.nextInt(Scanner.java:2258)
at java.base/java.util.Scanner.nextInt(Scanner.java:2212)
at OlympicWinners.main(OlympicWinners.java:14)

这是我得到的错误。第 14 行是

Medals.add(input.nextInt());

【问题讨论】:

  • 请显示minimal reproducible example(尤其是错误、预期和当前输出)。
  • 请遵守命名约定,变量名总是小写。所以country,name,medals。
  • 请注意,您可能还想按行阅读,然后用逗号分隔。否则,您可能会因为输入错误而切换到下一行而不注意。沿着:List&lt;String&gt; lines = Files.readAllLines(Paths.get("Olympics.txt"))。然后String[] data = line.split(",");.
  • 仅作记录:A) 编写自己的 CSV 解析器逻辑是一个很好的练习,但在现实世界中,您最好使用众多现有库之一。你在这里重新发明轮子(重复其他人过去犯的所有错误) B)小心将这些信息放入 3 个不同的列表中,并通过 index 将它们“连接”起来。而是考虑创建一个类来模拟文件中的一个 ROW,例如“MedalWinner”。该类将具有三个字段(用于国家、名称、计数)。然后将该类的一个对象放在一个列表中。你的想法
  • 使用三个列表来表示一起属于 one 对象的数据与在良好的 OOP 中处理此类任务的方式完全相反。

标签: java arrays separator


【解决方案1】:

从您的文本示例中,分隔符不是用空格 (" , ") 包围的逗号,而只是一个逗号 (",")。删除这些空格,你应该没问题:

input.useDelimiter(",");

【讨论】:

  • 似乎无法解决问题。这就是我得到的:java.base/java.util.Scanner.throwFor(Scanner.java:939) at java.base/java.util.Scanner.next(Scanner) 的线程“main”java.util.InputMismatchException 中的异常.java:1594) 在 java.base/java.util.Scanner.nextInt(Scanner.java:2258) 在 java.base/java.util.Scanner.nextInt(Scanner.java:2212) 在 OlympicWinners.main(OlympicWinners. java:14)
  • @BenjaminWu 无法解决您的问题。我们现在只能猜测。提供minimal reproducible example。
【解决方案2】:

你得到InputMismatchException,因为最后一行input.nextInt()返回

"18 
United States"

由于18 和United States 之间没有, 分隔符(但有行分隔符\n),每个标记都从分隔符返回到分隔符。

你应该从文件中读取所有行并用分隔符分割它们:

List<String> lines = Files.readAllLines(Paths.get("Olympic.txt"));

for (String line : lines) {
    String[] fields = line.split(",");
    country.add(fields[0]);
    name.add(fields[1]);
    medals.add(Integer.valueOf(fields[2]));
}

【讨论】:

  • 尝试了您的解决方案,但我在线程“main”java.lang.ArrayIndexOutOfBoundsException 中出现异常:Index 1 out of bounds for length 1 at OlympicWinners.main(OlympicWinners.java:14) 和第 14 行是name.add(fields[1]);
  • @BenjaminWu 确保在您的 txt 文件中每行正好有 3 个字段
  • 中间有空格的国家(例如美国)会对此有影响吗?
  • @BenjaminWu No. 有指定分隔符.split(",")。空格被忽略
  • @BenjaminWu ArrayIndexOutOfBoundsException: Index 1 出现很可能是因为 txt 文件中的一行只有国家/地区值。但没有名字和勋章
【解决方案3】:

请将您的代码修改为:

public class Main {

    public static void main(String[] args) throws FileNotFoundException {
        ArrayList<String> country = new ArrayList<>();
        ArrayList<String> name = new ArrayList<>();
        ArrayList<Integer> medals = new ArrayList<>();
        BufferedReader reader;
        try {
            reader = new BufferedReader(new FileReader("F://test.txt"));
            String line = reader.readLine();
            while (line != null) {
                String[] lineParts = line.split(",");
                country.add(lineParts[0]);
                name.add(lineParts[1]); 
                medals.add(Integer.valueOf(lineParts[2]));
                line = reader.readLine();
            }
            reader.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        System.out.println(country);
        System.out.println(name);
        System.out.println(medals);

    }

}

在 test.xml 中:

Soviet Union,Larisa_LATYNINA,18
United States,Michael_PHELPS,16
Soviet Union,Nikolay_ANDRIANOV,15

代码输出:

[Soviet Union, United States, Soviet Union]
[Larisa_LATYNINA, Michael_PHELPS, Nikolay_ANDRIANOV]
[18, 16, 15]

【讨论】:

    猜你喜欢
    • 2016-08-19
    • 2017-04-27
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 2011-09-08
    • 1970-01-01
    相关资源
    最近更新 更多