将.csv文件中的标记添加到Java中的ArrayList

时间:2012-02-20 05:26:07

标签: java generics arraylist stringtokenizer token

我在从.csv文件中获取的令牌中创建Java ArrayList时遇到了麻烦。我一直试图弄清楚几个小时没有成功。如果不创建ArrayList,我的所有令牌都会打印出来而没有问题,但是当我创建ArrayList来添加它们时,我遇到了麻烦。对于每行包含60多行和9个令牌(字符串)的.csv文件,我在添加到ArrayList之前打印出我的内容,但在创建ArrayList并向其添加令牌后,我只能在我遇到NoSuchElementException之前打印出前几个令牌。

这是我的全部代码:

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方法,类型转换st.nextToken(),并将变量分配给st.nextToken(),例如这样:

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

......但这些方法似乎都不起作用。

此程序的目标是获取传入的.csv文件中的所有令牌,并将它们整齐地放在ArrayList中以便稍后使用。我对Java仍然很陌生,目前还不清楚泛型如何在解决这个问题上发挥作用。据我了解,StringTokenizer的类型为“字符串”,但我需要使用<String>将我的令牌输入由ArrayList组成的<Strings>,但不确定如何。任何帮助/提示/反馈都非常感谢!!!

5 个答案:

答案 0 :(得分:2)

A)每次循环时你都会调用st.nextToken()两次。你刚刚丢失了所有其他令牌,最终它会因为第二次调用而失败...没有一个(如果你的csv文件中每行有10个项目,那么它会成功,你的{有5个东西在{ {1}})

B)不要在新代码中使用ArrayList。它的Javadoc解释了它是一个遗留类,而是使用StringTokenizer

String.split()

完成。

编辑添加:如果确实需要String[] elements = strLine.split(","); 而不是数组,则可以执行以下操作:

ArrayList

答案 1 :(得分:0)

您已在st.nextToken中执行了System.out。因此令牌将不再存在。如果您需要System.out,请先将st.nextToken指定给变量&amp;然后使用它。

答案 2 :(得分:0)

每次循环时,你都会向前跳两个元素。代码读取令牌,然后使用它:

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

然后:

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

                            list.add(token);

答案 3 :(得分:0)

在循环中调用nextToken方法两次,您可能需要将代码更改为:

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

                            list.add(tempStr);
                    }

答案 4 :(得分: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]);
}