簡體   English   中英

JAVA - 將CSV導入ArrayList

[英]JAVA - import CSV to ArrayList

我正在嘗試使用StringTokenizer導入CSV文件到Arraylist

public class Test
{
  public static void main(String [] args)
  {
    List<ImportedXls> datalist = new ArrayList<ImportedXls>();

    try
    {
      FileReader fr = new FileReader("c:\\temp.csv");
      BufferedReader br = new BufferedReader(fr);
      String stringRead = br.readLine();

      while( stringRead != null )
      {
        StringTokenizer st = new StringTokenizer(stringRead, ",");
        String docNumber = st.nextToken( );
        String note = st.nextToken( );  /** PROBLEM */
        String index = st.nextToken( ); /** PROBLEM */

        ImportedXls temp = new ImportedXls(docNumber, note, index);
        datalist.add(temp);

        // read the next line
        stringRead = br.readLine();
      }
      br.close( );
    }
    catch(IOException ioe){...}

    for (ImportedXls item : datalist) {
      System.out.println(item.getDocNumber());
    }
  }
}

我不明白nextToken是如何工作的,因為如果我將初始化三個變量( docNumbernoteindex )保持為nextToken() ,它將失敗:

Exception in thread "main" java.util.NoSuchElementException
    at java.util.StringTokenizer.nextToken(Unknown Source)
    at _test.Test.main(Test.java:32)

如果我只保留docNumber,它就可以了。 你可以幫幫我嗎?

您的輸入文件的某些行似乎有少於3個以逗號分隔的字段。您應該始終檢查tokenizer是否有更多令牌(StringTokenizer.hasMoreTokens),除非您100%確定您的輸入是正確的。

CORRECT解析CSV文件並非如此簡單。 為什么不使用能夠做得很好的庫 - http://opencsv.sourceforge.net/

好像你的代碼到達了一條線,Tokenizer只分成1部分而不是3部分。是否可能有缺少數據的行? 如果是這樣,你需要處理這個問題。

最有可能你的輸入文件不包含由分隔的另一種元素,至少在一行。 請告訴我們您的輸入 - 如果可能,請輸入失敗的行。

但是,您不需要使用StringTokenizer 使用String#split()可能更容易:

...
while( stringRead != null )
{
    String[] elements = stringRead.split(",");

    if(elements.length < 3) {
      throw new RuntimeException("line too short"); //handle missing entries
    }

    String docNumber = elements[0];
    String note = elements[1];
    String index = elements[2];

    ImportedXls temp = new ImportedXls(docNumber, note, index);
    datalist.add(temp);

    // read the next line
    stringRead = br.readLine();
}
...

您應該能夠使用hasMoreTokens()方法檢查您的令牌。 如果返回false,則您讀取的行可能不包含任何內容(即空字符串)。

盡管使用String.split()方法會更好 - 如果我沒有弄錯,有計划棄用StringTokenizer類。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM