2011-04-04 84 views
0

我有一個csv文件,其中包含nyse中的所有股票報價。第一列是符號第二列是公司的名稱。將csv文件導入java swing表

我有一個使用java swing庫在netbeans中製作的搜索框和表格。

現在,當我在框中輸入名稱時,它將返回正確數量的行。因此,例如,如果我搜索GOOG,它將只返回2行(GOOG代碼爲1行,在公司名稱中爲1行)。但是,行內的數據不是正確的,它只是一遍又一遍地打印csv文件的第一行。這裏是點擊搜索按鈕時被執行的代碼:

package my.Stock; 


import java.util.ArrayList; 
import java.util.Scanner; 
import java.io.BufferedReader; 
import java.util.StringTokenizer; 
import java.io.FileReader; 
import java.io.*; 

public class searchy { 

    public static void doSearch(String s){ 


            javax.swing.JTable resTable = StockUI.stockUI.getResultTable(); 
            javax.swing.table.DefaultTableModel dtm = 
              (javax.swing.table.DefaultTableModel) resTable.getModel(); 

            while (dtm.getRowCount()> 0) dtm.removeRow(0); 





      String sym = s.trim().toUpperCase(); 

try { 

//csv file containing data 
String strFile = "companylist.csv"; 

//create BufferedReader to read csv file 
BufferedReader br = new BufferedReader(new FileReader(strFile)); 
String strLine = ""; 
StringTokenizer st = null; 
int lineNumber = 0, tokenNumber = 0; 

//create arraylist 
ArrayList<String> arrayList = new ArrayList<String>(); 

//read comma separated file line by line 
while((strLine = br.readLine()) != null){ 

lineNumber++; 

//break comma separated line using "," 
st = new StringTokenizer(strLine, ","); 

while(st.hasMoreTokens()){ 

//display csv values 
tokenNumber++; 

arrayList.add(st.nextToken()); 
//System.out.println("Line # " + lineNumber + ": "+ st.nextToken() + " " + st.nextToken()); 
} //end small while 

//reset token number 
tokenNumber = 0; 

} //end big while loop 

//send csv to an array 
Object[] elements = arrayList.toArray(); 
/* 
for(int i=0; i < elements.length ; i++) { 
     System.out.println(elements[i]); 

} */ 
Scanner input = new Scanner(System.in); 
System.out.print("Enter Ticker symbol"); 
//String sym = input.next().toUpperCase(); //convert to uppercase to match csv 
int j=0; 
for(int i=0; i < elements.length ; i++) { 
    if (((String) elements[i]).contains(sym)){ 
     //System.out.println(elements[i]); 

     dtm.addRow(elements); 
     j++; 
     if (j==25) break; //only show this many results 
    } 


} 

} 
catch(Exception e){ 
System.out.println("Exception while reading csv file: " + e); 
} 
    } 
} 

我明白這是爲什麼發生的事情,但我不知道如何告訴它打印正確的行,因爲我不能使用dtm.addRow(元素[I]);

任何幫助,非常感謝。

+0

這種代碼真的很差結構。嘗試封裝邏輯並將您的應用程序分爲模型視圖控制器。當邏輯如此混亂時,很難知道你的問題是什麼。閱讀Wikipedia上的MVC模式:http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller – I82Much 2011-04-05 01:28:32

回答

1

嘗試CSVManager

+0

無需爲此類功能付費。 Ostermiller的utils有這個免費的:http://ostermiller.org/utils/CSV.html – I82Much 2011-04-05 01:29:06

0

我收集來自雅虎的股票的csv數據,奇怪的是,他們偶爾每隔一段時間使用其中包含逗號的公司名稱(例如「杜比公司」)來搞砸它。當然,這會拋棄CSV文件的解析。我不知道這可能是你的問題。

約翰·多納

0
package recommendation.event.test; 

    import java.io.FileReader; 
    import com.csvreader.CsvReader; 
    public class ReadCSV { 
    public static void main (String [] args){ 
    try { 


     CsvReader products = new CsvReader("resources/Event Recommendation Engine Challenge/data/test.csv"); 

     products.readHeaders(); 

     while (products.readRecord()) 
     { 
      String user = products.get("user"); 
      String event = products.get("event"); 
      String invited = products.get("invited"); 
      String timestamp = products.get("timestamp"); 

      System.out.println(user + " : " + event+" : "+invited+" : "+timestamp); 
     } 

     products.close(); 
    }catch (Exception e) { 
     // TODO: handle exception 
    } 

     } 
    }