2012-11-20 88 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); 
    } 
}