我正在努力使用扫描仪类来读取文本文件,同时跳过空白行。
有什么建议吗?
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;
答案 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变量来模拟文件中的数据。
第一段代码是您如何简单地从文件中读取所有数据行。逻辑很简单:
hasNextLine()
方法,以便查看是否有数据nextLine()
方法以获取数据行然后,下一个代码块仅添加一个“如果条件”,以便您仅显示非空白数据。
最后,第三段代码更接近您想要的代码。读取每一行数据时,它会将数据拆分为一个数组,然后将该数组添加到2D数组中。
这是您需要更改的代码部分。您需要先将String数组转换为double数组,然后再将其添加到2D数组中。因此,请首先更改此代码以使其正常工作。然后,一旦理解了这一概念,就可以对您的实际应用程序进行必要的更改。
请注意我的代码中最后一行如何显示[null,null]。这就是为什么使用数组不是一个好主意的原因,因为您永远不知道数组应该有多大。如果少于5,则会得到空值。如果您的计算机超过5个,则会出现超出范围的异常。