繁体   English   中英

bufferedreader不会移至下一行

[英]bufferedreader won't move to the next line

晚上好,

我需要从文件中读取一些行,文件为csv,文件的结构如下:

4,
Mo Farah,30,
Jessica Ennis,27,

我需要读取这些值并将其放入变量中,这就是我尝试执行的操作:

  while(nextline != null){
           StringTokenizer st = new StringTokenizer(nextline,",");
           int size = Integer.parseInt(st.nextToken());
           System.out.println(size);

           nextline = reader.readLine();

           StringTokenizer st2 = new StringTokenizer(nextline, ","); //why???


           String name = st2.nextToken();
           System.out.println(name);
           int age = Integer.parseInt(st2.nextToken());

           System.out.println(age);

第一个int(4)读得很好,但是,如果我想移至下一行,它会引发noSuchElementException,因此我必须在“ // why ???”旁边写一行 为了移至下一行,我真的要在每次要移至下一行时实例化一个新的令牌生成器吗? 还是有更好的方法呢?

非常感谢你

让我们看看发生了什么

nextline = reader.readLine(); // I'm assuming you have this here
while(nextline != null){

下面将分析行"4,"并将其拆分为由分隔的令牌,它将包含1个令牌: "4"

       StringTokenizer st = new StringTokenizer(nextline,",");

以下将成功执行,但是您确实应该在执行此操作之前检查st.hasMoreTokens()返回true。 它将使用st的令牌"4" ,该令牌现在不再包含令牌:

       int size = Integer.parseInt(st.nextToken());
       System.out.println(size);

       // We read the next line into "nextline", this is okay but not pretty.
       // Also you need to check that nextline is not `null` here.
       nextline = reader.readLine();

       StringTokenizer st2 = new StringTokenizer(nextline, ","); //why???

为什么?

因为使st解析了行"4," 在解析该行之后分配nextline不会更新st的内部状态(无法实现)。 这样根本行不通。 因此,如果您在此处调用st.nextToken() ,则将获得如您所说的NoSuchElementException 因为您已经从st读取了"4" ,所以没有标记了。

如果您想使用StringTokenizer ,那么以下是正确的做法,它将导致将"Mo Farah,30,"行解析为令牌: "Mo Farah""30"

       st = new StringTokenizer(nextline, ","); // Just parse the new line.
       // You can reuse the old st variable as it is now depleted.

现在,以下代码将从下一行"Mo Farah"返回第一个令牌。 尽管再次,您确实应该首先检查st.hasMoreTokens()并给出合理的错误消息:

       String name = st.nextToken(); // Change from st2 to st
       System.out.println(name);
       int age = Integer.parseInt(st.nextToken()); // Ditto

       System.out.println(age);

因此,简短的答案是,是的,如果要使用StringTokenizer ,则必须为每行创建一个新的StringTokenizer 如果您不在乎行尾,则可以先读取所有行并将它们连接起来,然后再将所有行传递给StringTokenizer

但是最简单的方法就是使用String tokens [] = newline.split(“,”); 就像马克在回答中所做的那样。

如果我认为csv中的模式始终相同...:

  while(nextline != null){ 

      String[] lecture = reader.readLine().split(",");

       if(lecture.lenght()>0){
                  System.out.println("Name: " + lecture[0]);
               int age = Integer.parseInt(lecture[1]);//you need to int?

                  System.out.println(lecture[1]);
        }
              else
                  System.out.println("Name: " + lecture[0]);
    }

希望这可以帮助...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM