使用扫描仪读取文件,但将空白行跳过为二维数组

时间:2018-10-19 23:45:09

标签: java java.util.scanner

我正在努力使用扫描仪类来读取文本文件,同时跳过空白行。

有什么建议吗?

   Scanner sc = new Scanner(new BufferedReader(new FileReader("training2.txt")));

  trainingData = new double[48][2];
  while(sc.hasNextLine()) {
     for (int i=0; i<trainingData.length; i++) {

        String[] line = sc.nextLine().trim().split(" ");
        if(line.length==0) 
        {
            sc.nextLine();
        }else{
        for (int j=0; j<line.length; j++) {
           trainingData[i][j] = Double.parseDouble(line[j]);
        }
        }
     }
  }

  if(sc.hasNextLine())
  {
      sc.nextLine();
  }
  sc.close();

我目前正在尝试使其正常工作。但这不起作用

Scanner sc = new Scanner(new BufferedReader(new FileReader("training.txt")));

  trainingData = new double[48][2];
  while(sc.hasNextLine()) {
      String line = sc.nextLine().trim();
      if(line.length()!=0)
      {
        for (int i=0; i<trainingData.length; i++) {
        String[] line2 = sc.nextLine().trim().split(" ");
        for (int j=0; j<line2.length; j++) {
           trainingData[i][j] = Double.parseDouble(line2[j]);
        }
     }
      }

  }
  return trainingData;

2 个答案:

答案 0 :(得分:0)

尝试将其添加到您的代码中:

library(geojsonsf)
library(sf)

sf <- geojsonsf::geojson_sf("~/Downloads/Ohio.geojson")

sf
# Simple feature collection with 5449419 features and 0 fields
# geometry type:  POLYGON
# dimension:      XY
# bbox:           xmin: -84.82027 ymin: 38.40334 xmax: -80.51887 ymax: 41.97041
# epsg (SRID):    4326
# proj4string:    +proj=longlat +datum=WGS84 +no_defs
# First 10 features:
#   geometry
# 1  POLYGON ((-84.81222 39.9087...
# 2  POLYGON ((-84.80084 39.8882...
# 3  POLYGON ((-84.78565 39.8811...
# 4  POLYGON ((-84.7373 39.9014,...
# 5  POLYGON ((-84.73916 39.8980...
# 6  POLYGON ((-84.80422 39.8646...
# 7  POLYGON ((-84.80025 39.8592...
# 8  POLYGON ((-84.79336 39.8593...
# 9  POLYGON ((-84.79268 39.8604...
# 10 POLYGON ((-84.80194 39.8639...

它将忽略空白行。有关更多信息:Scanner.skip()

答案 1 :(得分:0)

while(sc.hasNextLine()) {
    for (int i=0; i<trainingData.length; i++) {
        String[] line = sc.nextLine().trim().split(" ");

您不能只检查扫描仪一次以查看其是否有数据,然后使用循环读取数据行。您不能仅仅因为定义数组来容纳48行数据就假定拥有48行数据。

您需要回到基础知识,学习如何一次从一行读取文件中的数据,然后再处理该数据。

这是一个入门的简单示例:

import java.util.*;

public class ScannerTest2
{
    public static void main(String args[])
        throws Exception
    {
        String data = "1 2\n\n3 4\n\n5 6\n7 8";

            // First attempt

        System.out.println("Display All Lines");
        Scanner s = new Scanner( data );

        while (s.hasNextLine())
        {
            String line = s.nextLine();
            System.out.println( line );
        }

            // Second attempt

        System.out.println("Display non blank lines");
        s = new Scanner( data );

        while (s.hasNextLine())
        {
            String line = s.nextLine();

            if (line.length() != 0)
            {
                System.out.println( line );
            }
        }

            // Final attempt    

        String[][] values = new String[5][2];
        int row = 0;

        System.out.println("Add data to 2D Array");
        s = new Scanner( data );

        while (s.hasNextLine())
        {
            String line = s.nextLine();

            if (line.length() != 0)
            {
                String[] digits = line.split(" ");
                values[row] = digits;
                row++;
            }
        }

        for (int i = 0; i < values.length; i++)
            System.out.println( Arrays.asList(values[i]) );
    }
}

该示例使用String变量来模拟文件中的数据。

第一段代码是您如何简单地从文件中读取所有数据行。逻辑很简单:

  1. 调用hasNextLine()方法,以便查看是否有数据
  2. 调用nextLine()方法以获取数据行
  3. 显示已读取的数据
  4. 重复步骤1-3,直到没有数据为止。

然后,下一个代码块仅添加一个“如果条件”,以便您仅显示非空白数据。

最后,第三段代码更接近您想要的代码。读取每一行数据时,它会将数据拆分为一个数组,然后将该数组添加到2D数组中。

这是您需要更改的代码部分。您需要先将String数组转换为double数组,然后再将其添加到2D数组中。因此,请首先更改此代码以使其正常工作。然后,一旦理解了这一概念,就可以对您的实际应用程序进行必要的更改。

请注意我的代码中最后一行如何显示[null,null]。这就是为什么使用数组不是一个好主意的原因,因为您永远不知道数组应该有多大。如果少于5,则会得到空值。如果您的计算机超过5个,则会出现超出范围的异常。