1

我有一个看起来像这样的文件:

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

我究竟做错了什么?正如我所说,我只想要每行的前两个字段,稍后我会想用它们对数据库进行多次插入。什么是好的数据结构?我正在努力成为一名出色的编码员,因此将不胜感激任何建议!

4

6 回答 6

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);
}
于 2012-11-20T16:43:37.350 回答
1
while ((linea = rEntrada.readLine()) != null){
   tokens = linea.split(delimitador);
}

这将继续从文件中读取行并拆分它们。在每次迭代中,您将有一行标记 in tokens,但在接下来的迭代中,引用tokens将用于指向读取的新行的标记。当循环退出时,intokens仍然是从最后一行读取的数据。

你要么

a)只需避免while和读取两次readLine(并在每行之后,处理和存储令牌)

b)处理循环内的标记,因此您处理每一行而不是唯一一行。

为了测试我的观点,在while循环中添加日志。

于 2012-11-20T16:46:25.747 回答
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]);
}

当然,取决于它有多大以及是否存在内存问题,您可能希望主动删除其他未使用的信息。

于 2012-11-20T16:48:04.263 回答
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);
  }
}
于 2012-11-21T06:16:43.193 回答
0

检查文件中的行分隔符,可能只有在“00123;Hello how are you;02;28”之后才有它,因此第二次调用 readLine() 将返回“00154;Random text;03;12”

否则,粘贴工作示例,因为您似乎正在循环到文件末尾。

于 2012-11-20T16:47:22.657 回答
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;
    }
}
于 2012-11-20T16:59:00.790 回答