当前位置: 首页 > 知识库问答 >
问题:

将表格从文本文件读取到2darray

孙渝
2023-03-14

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


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

此外,当我硬编码行数以便检查其他一切是否正常时,我得到了一个line not found错误。请帮帮我。我将链接下面的代码。


    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

共有1个答案

韦阳晖
2023-03-14

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

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

这就是为什么您的后续迭代会立即停止,并且不会显示预期的输出。也许,您所期望的是,一旦到达文件末尾,扫描仪的内部光标就会自动重置。但是,这绝对不是Scanner类(或任何其他类)的行为,它的任何方法都不能将Scanner的光标重置或重新定位到文件的特定点。

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

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

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);
        }
    }
}
 类似资料:
  • 编写了通过Spark读取文本文件的代码...在Local中运行良好...但在HDInsight中运行时产生错误->从Blob读取文本文件 org.apache.spark.sparkException:作业由于阶段失败而中止:阶段0.0中的任务0失败了4次,最近的失败:阶段0.0中丢失的任务0.3(TID 5,wn1-hchdin.bpqkkmavxs0ehkfnaruw4ed03d.dx.int

  • null > 构造函数,它接受两个输入:(String,String)。这两个输入以正确的顺序表示lastname和firstname。构造函数只需将参数中的数据分配给实例变量。 名为toString()的公共实例方法,它返回一个字符串数据(学生的姓名),格式为“lastname,firstname”。 类MainApp null

  • 问题内容: 我有一个包含一些元数据的文件,然后是包含2个带有标题的列的实际数据。在numpy中使用genfromtxt之前,是否需要将两种类型的数据分开?还是可以以某种方式拆分数据?将文件指针放在标题上方行的末尾,然后从那里尝试genfromtxt怎么办?谢谢该文件的格式如下所示: 问题答案: 如果您不希望第一行,请尝试(如果没有丢失的数据): 或(如果缺少数据): 如果然后要解析标头信息,则可以

  • 我正在编写一个程序,读取文本文件,并显示第一个学生的姓名、年级和全班平均成绩。对于上面给出的文件,结果如下:类中的第一个是Ahmad Hamwi has 16.00,类的平均值是12.25这是我试图读取的W文本文件 这就是我一直犯的错误 我已经试了几个小时了。我知道错误在第37行。这可能与类型有关。我尝试了int和浮动,但一样。

  • 我有一个关于读取和创建数据集的问题。我有一个文本文件,其中包含: 我这样实现了这段代码: 而不是有这样的结果: 它给了我一个结果: 谁能告诉我怎么解决这个问题?