从文本文件读取 table 到二维数组

Reading table from a text file to a 2darray

我有一个 java 代码,我在其中读取一个 txt 文件,然后对其进行迭代,以便我可以将其填充到二维数组中。 读取文件后,我能够打印出其内容,因此我确定文件已被读取。并且我还确定 bufferedreader 库的 .hasNextLine 方法在找到一行时显示为 true。 但是当我在 while 循环中使用它时,它就像没有找到任何行一样,因此它没有迭代,所以我不知道我在 table.==>[=14 中有多少行=]


while (sc.hasNextLine()==true){ row++;}

此外,当我对行数进行硬编码以便检查其他一切是否正常时,我收到一条未找到行的错误。请帮帮我。 我将 link 下面的代码。


    package com.company;
    import java.io.BufferedReader;
   import java.io.FileReader;
   import java.util.Arrays;
   import java.util.Scanner;
   public class Main {

        public static void 
    main(String args[]) throws Exception {
        int row=0;
        int column=0;
        int count=0;

        BufferedReader x = new BufferedReader(new FileReader("src\Table.txt"));
        Scanner sc = new Scanner(x);
        System.out.println(sc.nextLine()+sc.hasNextLine()+"\n"+sc.nextLine()+sc.hasNext()+"\n"+sc.nextLine()+"\n"+sc.nextLine()+sc.hasNextLine());

        while (sc.hasNextLine()==true){ row++;}
        System.out.println(row);
        for (int i=0; i<row; i++) {
            String[] line = sc.nextLine().trim().split(",");
            System.out.println(line);
            for (String line1 : line) {
                if (",".equals(line1)) {
                    count++;
                }
                count+=1;
                if(count>column){
                    column=count;
                }
            }
        }
        String [][] myArray = new String[row][column];


        for (int i=0; i<myArray.length; i++) {
            String[] line = sc.nextLine().trim().split(",");
            for (int j=0; j<line.length; j++) {
                myArray[i][j]= line[j];
            }
        }

        System.out.println(Arrays.deepToString(myArray));
    }
}

我也得到这个输出

"C:\Program Files\Java\jdk-12.0.1\bin\java.exe" "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2021.3.2\lib\idea_rt.jar=52205:C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2021.3.2\bin" -Dfile.encoding=UTF-8 -classpath "C:\Users\acer pc\IdeaProjects\PDM\out\production\PDM" com.company.Main
CalculusII,Algebra,Networktrue
CalculusII,Algebra,Webtrue
CalculusIII,Prog2,Network
Algebra,Prog1,Webfalse
0
[]

Process finished with exit code 0

当您执行以下语句时,您已经阅读了整个文件,因此没有剩余行可供阅读。

System.out.println(sc.nextLine()+sc.hasNextLine()+"\n"+sc.nextLine()+sc.hasNext()+"\n"+sc.nextLine()+"\n"+sc.nextLine()+sc.hasNextLine());

这就是为什么您的后续迭代立即停止并且未显示预期输出的原因。也许,您所期望的是扫描仪的内部光标在到达文件末尾后自行重置。但是,这绝对不是 Scanner class(或任何其他)的行为,并且其方法的 none 提供将扫描仪的光标重置或重新定位到文件的特定点.

您需要做的是关闭您的连接并 re-establish 它们以重新开始阅读内容。例如,您可以在 try 块中包含每个文件消耗,以便在完成后自动处理每个连接。

为了简化您的代码,在您的第一个循环中您可以计算行数并检查具有“最多列”的行,而在您的第二个循环中您可以 re-read 文件的内容。

public class Main {
    public static void main(String args[]) {
        int row = 0;
        int column = 0;
        int tmp = 0;

        try (FileReader fr = new FileReader("src\Table.txt");
             BufferedReader br = (new BufferedReader(fr));
             Scanner sc = new Scanner(br)) {

            //First file consumption
            while (sc.hasNextLine()) {
                row++;
                tmp = sc.nextLine().split(",").length;
                if (tmp > column) {
                    column = tmp;
                }
            }
            System.out.println(row);
        } catch (FileNotFoundException e) {
            throw new RuntimeException(e);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }

        try (FileReader fr = new FileReader("src\Table.txt");
             BufferedReader br = (new BufferedReader(fr));
             Scanner sc = new Scanner(br)) {

            //Second file consumption
            String[][] myArray = new String[row][column];
            for (int i = 0; i < myArray.length; i++) {
                String[] line = sc.nextLine().trim().split(",");
                for (int j = 0; j < line.length; j++) {
                    myArray[i][j] = line[j];
                }
            }
            System.out.println(Arrays.deepToString(myArray));
        } catch (FileNotFoundException e) {
            throw new RuntimeException(e);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}