【问题标题】:Using Scanner in Java在 Java 中使用扫描仪
【发布时间】:2014-04-10 16:11:40
【问题描述】:

编写一个读取 n .csv 文件并创建对象“Account”的类。 这是一个测试。

代码:

import java.io.File;
import java.util.Scanner;
import java.io.FileNotFoundException;

public class AccountTest {

    public static void main(String[] args) throws FileNotFoundException {
        File file = new File("1234567890989.csv");
        Scanner scanner;
        try {
            scanner = new Scanner(file);

            while(scanner.hasNext()) {
                scanner.nextLine();
                scanner.next("Account");
                String pp = scanner.next();

                System.out.println(pp);

            }


        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

}    

文件:

Account Info - 14-03-2014
Account  ;1234567890989 ; EUR  ;POUPANCA ;SavingsAccount ;
Start Date ;31-10-2013
End Date ;03-01-2014
Date ;Value Date ;Description ;Draft ;Credit ;Accounting     balance ;Available balance 
31-10-2013 ;31-10-2013 ;SUMMARY ;0.0 ;200.0 ;2600.0 ;2600.0
30-11-2013 ;30-11-2013 ;SUMMARY ;0.0 ;200.0 ;2800.0 ;2800.0
31-12-2013 ;31-12-2013 ;SUMMARY ;0.0 ;200.0 ;3000.0 ;3000.0
02-01-2014 ;02-01-2014 ;TRANSF ;0.0 ;300.0 ;3300.0 ;3300.0
02-01-2014 ;02-02-2014 ;TRANSF ;0.0 ;300.0 ;3600.0 ;3600.0
03-01-2014 ;03-01-2014 ;TRANSF ;0.0 ;300.0 ;3900.0 ;3900.0

返回 ';1234567890989' 但我只想拥有 '1234567890989' 并将其格式化为 Long。

【问题讨论】:

  • CSV 以逗号分隔。您的输入以冒号分隔。
  • 定义“将其格式化为长”。 1234567890989 是一个 long(java 原始类型)值。
  • @DwB,CSV 也可以表示“字符分隔值”。这是一种定义非常糟糕的文件格式。

标签: java string file java.util.scanner long-integer


【解决方案1】:

如果我理解正确,这应该可以 -

if (scanner.hasNextLine()) {            // Check for the line.
    scanner.nextLine();                 // read the line.
    if (scanner.hasNext("Account")) {   // Check for account.
        scanner.next("Account");        // read the field.
        if (scanner.hasNext()) {        // Check if there is more.
            String pp = scanner.next(); // read it.
            if (pp.startsWith(";")) {   // remove a leading ';'
                pp = pp.substring(1);
            }
            long lpp = Long.parseLong(pp);  // convert to long.
            System.out.println(lpp);        // print it.
        }
    }
}

输出是

1234567890989

【讨论】:

  • 此代码可能会从文件中提取帐号,但对于 OP 创建Account 对象的最终目标(这可能需要解析整个文件)并不是特别有用。
  • @BrianS 如果你去改变问题,那当然!我可能会使用 StringTokenizer (或添加一个 Account 构造函数,然后使用整行)。
【解决方案2】:

试试这个:

...
String pp = scanner.next();
String qq;

qq = StringUtils.strip(StringUtils.trim(pp), ";");

StringUtils 是Apache Commons Lang 的一部分

strip 删除字符串开头和结尾的字符, 所以一定要在调用strip之前修剪空白。

【讨论】:

    【解决方案3】:

    默认情况下,Scanner 使用空格作为分隔符。因此,Scanner.next 正在查看您文件中的所有这些空格并以此分隔您的值,因此您正在捕获分号。

    您可以更改与useDelimiter 方法一起使用的分隔符。这些方面的东西应该可以工作:

    Scanner scanner = new Scanner(new File("1234567890989.csv")).useDelimiter(";");
    while (scanner.hasNext())
    {
        String token = scanner.next();
        ...
    }
    

    要将您的令牌转换为long,您必须决定令牌是否应该长,然后使用Long.parseLong(token)

    【讨论】:

      猜你喜欢
      • 2013-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多