2012-11-20 35 views
1

存儲記錄我有一個看起來是這樣的文件:解析和Java中

00000;Name blah blah blah;02;13 
00032;I don't care;01;44 
00123;Hello how are you;02;28 
00154;Random text;03;12 

我只關心前兩個記錄:

00000 Name blah blah blah 
00032 I don't care 

等。所以我想我可以在Java中使用split函數來獲取數據。 (任何人有更好的主意?)類似這樣的:

String linea = rEntrada.readLine(); 
String delimitador = "[;]"; 
String[] tokens = null; 
while ((linea = rEntrada.readLine()) != null){ 
    tokens = linea.split(delimitador); 
} 

這似乎只存儲最後一個記錄。當我這樣做:

for (String token : tokens){ 
    logger.info("Token: " + token); 
} 

我得到:

Token: 00154 
Token: Random text 
Token: 03 
Token: 12 

我在做什麼錯?正如我所說,我只想每行的前兩個字段,後來我想用它們對數據庫進行多次插入。什麼是一個好的數據結構?我試圖成爲一個偉大的編碼器,所以任何意見將不勝感激!

+0

您已經在數據中解析。你爲什麼不從陣列中取出前兩個字符串,你已經有了? 'logger.info(「first token:」+ tokens [0] +「second token:」+ tokens [1]);' – DRCB

+0

您總是得到最後一條記錄,因爲您正在覆蓋循環中的標記變量。 –

回答

1

在這個循環中,你面積不增加的每一行的結果數組,你用新的替代先前的結果,所以,當你到達終點,只有最後一個是存在的!

while ((linea = rEntrada.readLine()) != null){ 
    tokens = linea.split(delimitador); 
} 

你可以做這樣的事情:它是多麼大

List<String[]> token = new ArrayList<String[]>(); 
while ((linea = rEntrada.readLine()) != null){ 
    tokens.add(linea.split(delimitador)); 
} 

for (String [] token: tokens) { 
    System.out.println(token[0] + ":" token[1]); 
} 

當然取決於和是否有記憶的關注您可能要主動刪除其他未使用的信息。

1

我會創建一個只有這兩個字段的持有者類,並將該對象添加到arraylist。

例子:

Holder 
{ 
int firstAttribute; 
String secondAttribute; 
//Get/Set methods 
} 

String[] tokens = null; 
List<Holder> list = new ArrayList<Holder>(); 
while ((linea = rEntrada.readLine()) != null){ 
    tokens = linea.split(delimitador); 
    Holder hObj = new Holder(); 
    hObj.setFirstAttribute(tokens[0]); 
    hObj.secondAttribute(tokens[1]); 
    list.add(hObj); 
} 
1
while ((linea = rEntrada.readLine()) != null){ 
    tokens = linea.split(delimitador); 
} 

這將繼續從文件讀取的線條和分裂他們。在每次迭代中,tokens中都會有一行標記,但在以下迭代中,將使用參考tokens指向新行讀取的標記。退出循環時,在tokens中保留最後一行讀取的數據。

你要麼

一)就避免whilereadLine(每行後,處理讀兩次行和保存標記)

B)過程中的循環內的代幣,讓你處理每一行而不是唯一一行。

爲了測試我的觀點,加上while循環內的日誌。

+0

我在回答時指的是這個,但你比較快。 –

0

檢查文件中的行分隔符,可能只有在「00123;你好,你是怎麼做的; 02; 28」之後纔有它,因此第二次調用readLine()會返回「00154;隨機文本; 03; 12"

否則,粘貼工作示例,因爲它似乎你到循環文件的末尾。

0
class Record { 
    String number; 
    String text; 

    public Record(String number, String text) { 
     super(); 
     this.number = number; 
     this.text = text; 
    } 
} 

class Parser{ 

    int maxLines=2; 

    public List<Record> parseFile(InputStream in){ 
     Scanner scanner = new Scanner(in); 
     List<Record> list = new ArrayList<Record>(); 
     String line = null;  
     int curLine=0; 
     while(curLine<maxLines && (line=scanner.nextLine())!=null){ 
      String[] split = line.split(";");    
      list.add(new Record(split[0], split[1])); 
      curLine++; 
     } 
     return list; 
    } 
} 
1
You could have printed the tokens inside while loop. 

String linea = rEntrada.readLine(); 
String delimitador = "[;]"; 
String[] tokens = null; 
while ((linea = rEntrada.readLine()) != null){ 
tokens = linea.split(delimitador); 

for (String token : tokens) 
    { 
    logger.info("Token: " + token); 
    } 
}