2012-11-15 67 views
2

我有一個字符串遵循的格式:的StringTokenizer對於分割空間

2012.11.15 22:00:00 1.2971 1.2974 1.2959 1.296 

我使用如下代碼:

DateFormat df = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss"); 
       String inputLine; 
       in.readLine(); 
       while ((inputLine = in.readLine()) != null) { 
        StringTokenizer st = new StringTokenizer(inputLine); 
        Date date  = df.parse(st.nextToken()); 
        double open  = Double.parseDouble(st.nextToken()); 
        double high  = Double.parseDouble(st.nextToken()); 
        double low  = Double.parseDouble(st.nextToken()); 
        double close = Double.parseDouble(st.nextToken()); 
       ... 

但方法SimpleDateFormate得到用作分隔日期/時間之間只有日期和空間。
如何與時間一起獲取日期?

回答

3

更好地使用String中的split()方法,出於所有實際目的,StringTokenizerdeprecated,它仍然只用於向後兼容。

嘗試這樣:

String[] data = inputLine.split("\\s+"); 

現在所產生的陣列中的每個位置將舉行一個數據,你可以繼續將其轉換爲相應的數據類型。特別是,日期(這是由實際日期加時間)做這樣的事情:

Date date = df.parse(data[0] + " " + data[1]); 

上述的好處是,你可以對獲得下令牌標記生成器忘記,從一開始你就會知道有多少元素被讀取(數組的長度)。

+1

...或者可以使用更復雜的正則表達式,如果日期/時間會出現在任何地方 '(\ d {4} \。\ d {2} \。\ d {2} \ s + \ d {2}:\ d {2}:\ d {2} | \ d + \。\ d +) \ s +' – Vicki

+0

感謝您的建議。我可以更改以下代碼嗎? 'double open = Double.parseDouble(data [3]); double high = Double.parseDouble(data [4]); double low = Double.parseDouble(data [5]); double close = Double.parseDouble(data [6]);' –

+0

我相信'open'變量的位置是'data [2]'。除此之外,你可以做到這一點。 –

2

用途:

Date date  = df.parse(st.nextToken() + " " + st.nextToken()); 

通過兩 「字」 的SimpleDateFormat的對象。

+0

我必須對'SimpleDateFormat(「yyyy.MM.dd HH:mm:ss」)'做任何修改? –

+0

謝謝!這是正確的解決方案。 –

+0

不客氣。 – dashrb

1

您創建一個StringTokenizer帶有一個參數構造函數(字符串tokenize)。這個構造函數假定任何空格是不同的記號之間的分隔符。你的日期表示在中間有空格。因此StringTokenizer排除了一半日期,剩下另一個令牌。

當你使用空格後分離等領域,簡單的解決辦法很簡單,就是讀令牌和重建相結合領域:

Date date = df.parse(st.nextToken()+" "+ st.nextToken());