2012-02-20 46 views
-1

我一直在使用从.csv文件获取的令牌在Java中创建ArrayList时遇到问题。我一直试图找出几个小时没有成功。如果不创建ArrayList,我所有的令牌都可以毫无问题地打印出来,但是当我创建一个ArrayList来添加它们时,我遇到了麻烦。对于每行包含60多行和9个标记(字符串)的.csv文件,我在添加到ArrayList之前打印出我拥有的内容,但在创建ArrayList并向它们添加标记之后,我只能打印出第一个在碰到一个NoSuchElementException之前几个令牌。将.csv文件中的令牌添加到Java中的ArrayList中

这是我的所有代码:

import java.io.BufferedReader; 
import java.io.FileReader; 
import java.io.FileWriter; 
import java.util.StringTokenizer; 
import java.lang.String; 
import java.util.ArrayList; 
import java.util.*; //probably redundant 
import java.util.Scanner; 

public class TTcompiler18Feb { 

    private static ArrayList<String> list; 

    public static void main(String[] args) { 

    try 
    { 
     //csv file containing data 
     String strFile = "FileWithTokens.csv"; 

     //create BufferedReader to read csv file 
     BufferedReader br = new BufferedReader(new FileReader(strFile)); 

     String strLine = ""; 
     StringTokenizer st = null; 
     int lineNumber = 0, tokenNumber = 0; 

     list = new ArrayList<String>(); 
     String token; 

     //read comma separated file line by line 
     while((strLine = br.readLine()) != null) 
     { 
     lineNumber++; 
     st = new StringTokenizer(strLine, ","); 

     while(st.hasMoreTokens()) 
     { 
      tokenNumber++;  
      System.out.println("Line # " + 
          lineNumber + ", Token # " + 
          tokenNumber + ", Token : "+ 
          st.nextToken()); 
      list.add(st.nextToken()); 
     } 
     //reset token number 
     tokenNumber = 0; 
     } 
     System.out.println("The size of your list is: " + list.size()); 
    } 
    catch(Exception e) 
    { 
     System.out.println("Exception while reading csv file: " + e);     
    } 
    } 
} 

我跑我的代码,并得到如下:

运行TTcompiler18Feb

Line # 1, Token # 1, Token : Row1Token1 
Line # 1, Token # 2, Token : Row1Token2 
Line # 1, Token # 3, Token : Row1Token3 
Line # 1, Token # 4, Token : Row1Token4 
Line # 1, Token # 5, Token : Row1Token5 
Exception while reading csv file: java.util.NoSuchElementException 

我尝试添加到我的以list.add(st.nextToken());之外的其他方式列出,例如使用.toString方法,t ypecasting st.nextToken(),并st.nextToken()为变量赋值,就像这样:

token = st.nextToken().toString(); //defined as string type outside loop 
list.add(token); 

...但这些方法都没有似乎工作。

该程序的目标是获取传入的.csv文件中的所有标记,并将它们整齐地放入ArrayList以供稍后使用。我对Java仍然很陌生,对于泛型如何在解决这个问题中起作用仍然不清楚。据我了解,StringTokenizer是'string'类型,但我需要使用一个<String>将我的令牌输入到由<Strings>组成的ArrayList,但不知道如何。任何帮助/提示/反馈非常感谢!

回答

2

A)每次循环播放时,您都会打电话st.nextToken()两次。你只是失去了所有其他的令牌,并最终因为第二次电话而呕吐......没有一个(如果你在csv文件中每行有10个项目,它会成功,你会有5件事在你的ArrayList

B)不要在新代码中使用StringTokenizer。 Javadoc为它解释了它是一个遗留类,并使用String.split()来代替。

String[] elements = strLine.split(","); 

完成。

编辑补充:如果你真的需要ArrayList而不是一个数组,你可以再做:

ArrayList<String> list = new ArrayList<String>(Arrays.asList(elements)); 
0

你已经在你的System.out做一个st.nextToken。所以令牌不再存在。如果您需要System.out,请将st.nextToken分配给变量&然后使用它。

0

在每次循环时,你都会跳跃前进两个元素。代码阅读记号,然后用它:

String token = ""; 
token = st.nextToken(); 

然后:

      System.out.println("Line # " + 
               lineNumber + ", Token # " + 
               tokenNumber + ", Token : "+ 
               token); 

          list.add(token); 
0

nextToken方法是在循环中调用了两次,你可能需要更改您的代码是这样的:

while(st.hasMoreTokens()) 
        { 
          tokenNumber++;  
          String tempStr = st.nextToken(); 
          System.out.println("Line # " + 
               lineNumber + ", Token # " + 
               tokenNumber + ", Token : "+ 
               tempStr); 

          list.add(tempStr); 
        } 
在其他的答案中提到
+0

我不能相信我错过了。感谢大家! – spacetree 2012-02-20 06:00:14

0

至于,你的问题是与调用不止一次nextToken更在单次迭代,这是不是它打算如何使用。

而不是使用笨重的旧StringTokenizer的,你为什么不使用String.split()

String[] tokens = strLine.split(","); 

for(int i = 0; i < tokens.length; i++) { 
    System.out.println("Line # " + 
         lineNumber + ", Token # " + 
         i+ ", Token : "+ 
         token[i]);  
    // do you even need a list? 
    list.add(token[i]); 
} 
相关问题