【问题标题】:Reading column-wise data from a text file in Eclipse从 Eclipse 中的文本文件中读取逐列数据
【发布时间】:2016-10-07 09:11:55
【问题描述】:

我正在使用 Eclipse 与 CPLEX 一起对车辆路线问题建模。我需要从文本文件中读取数据(请求点坐标、时间窗口等)。数据是按列的,所以我使用了一个拆分函数来存储我的变量。但是控制台在第一行数据本身显示错误。

代码:

public class VRP01k {
    public static void main(String args[]) throws FileNotFoundException{

    //Scanner input = new Scanner(new File("C:\\OR Research\\Code\\data01.txt"));
    Scanner input = new Scanner(new File("data01.txt"));

String line = input.nextLine();
      while(line != null) {
          String[] columns = line.split("\t");
          xPos[count] = Double.parseDouble(columns[0]);
          yPos[count] = Double.parseDouble(columns[1]);
          d[count] = Double.parseDouble(columns[2]);
          a[count] = Double.parseDouble(columns[3]);
          b[count] = Double.parseDouble(columns[4]);
          s[count] = Double.parseDouble(columns[5]);

          count++;
          line = input.nextLine();
    }

我尝试直接使用 C 驱动器中的文件并将其移动到我的 Java 项目中。两者都不起作用。错误如下:

Exception in thread "main" java.lang.NumberFormatException: For input string: "3.00      38.00       0.00       0.00    1187.00       0.00"
    at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:2043)
    at sun.misc.FloatingDecimal.parseDouble(FloatingDecimal.java:110)
    at java.lang.Double.parseDouble(Double.java:538)
    at VRP01k.main(VRP01k.java:32)

数据文件的前几行是:

 3.00      38.00       0.00       0.00    1187.00       0.00
44.00      28.00       0.00     342.00     365.00       0.00
26.00      44.00       0.00      20.00      93.00       0.00
 7.00      41.00       0.00       0.00      45.00       0.00
17.00      28.00       0.00     250.00     292.00       0.00

请帮忙。谢谢。

这是新代码:

public class VRP01k {
public static void main(String args[]) throws FileNotFoundException{

//Scanner input = new Scanner(new File("C:\\OR Research\\Code\\data01.txt"));
Scanner input = new Scanner(new File("data01.txt"));
    String line = input.nextLine();
         while(line != null) {
              String [] columns = line.trim().split("\\s+");
              xPos[count] = Double.parseDouble(columns[0]);
              yPos[count] = Double.parseDouble(columns[1]);
              d[count] = Double.parseDouble(columns[2]);
              a[count] = Double.parseDouble(columns[3]);
              b[count] = Double.parseDouble(columns[4]);
              s[count] = Double.parseDouble(columns[5]);

              count++;
              line = input.nextLine();
                }

还有错误:

Exception in thread "main" java.lang.NumberFormatException: empty String
    at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1842)
    at sun.misc.FloatingDecimal.parseDouble(FloatingDecimal.java:110)
    at java.lang.Double.parseDouble(Double.java:538)
    at VRP01k.main(VRP01k.java:32)

【问题讨论】:

  • 您的拆分不起作用 - 可能您实际上在数字之间没有制表符。
  • 尝试修剪,例如columns[0].trim()。并尝试打印出columns[0] 来判断分裂是否真的发生了。
  • 可能它们只是空格......检查一下......
  • @greg-449 看来毕竟没有制表符。但是我如何区分每行的黑白不同元素?空格 b/w 数字是不同的。
  • 查看我的回答,它处理可变数量的空格。

标签: java eclipse cplex


【解决方案1】:

您的异常表明输入的数字格式有误:

"3.00      38.00       0.00       0.00    1187.00       0.00"

所以您的 split 实际上并没有拆分输入字符串,只是将整行传递给第一个 Double.parseDouble

您很可能在数字之间使用空格而不是制表符。所以使用类似的东西:

String [] columns = line.trim().split("\\s+");

用于拆分。这是在进行拆分之前修剪前导和尾随空格以使事情更容易,然后在一个或多个“空格”字符上进行拆分 - 这将处理空格和制表符。

【讨论】:

  • 我试过这个,但它显示一个关于空字符串的错误。线程“主”java.lang.NumberFormatException 中的异常:空字符串。
  • 它适用于我的第一行数据。哪条线路导致了问题?
  • 控制台没有提到这一点。如果我使用六个空白字符作为分隔符,它会上升到 0.00 1187.00 然后失败,但使用 \\s+ 会给出一个空字符串
  • 向我们确切展示您现在使用的代码以及问题输入行的确切内容。
  • 我在问题本身中包含了新代码和错误。
猜你喜欢
  • 1970-01-01
  • 2012-03-10
  • 1970-01-01
  • 2019-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多