0

在java中,我想快速解析一个包含异构数据(数字和字符)的文件。

我一直在阅读ByteBuffer和内存映射文件。

我可以复制它,但是在解析数据时它变得很棘手。我想分配各种字节。但它变得依赖于编码?

如果文件的格式是,例如:

someString 8
some other string 88

如何将其解析为StringInteger对象?

谢谢!

你做。

4

3 回答 3

2

假设您的格式类似于

{string possibly with spaces} {integer}\r?\n

您需要搜索换行符,然后向后工作,直到找到第一个空格。您可以自己解码数字并将其转换为 anint或将其转换为 String 并解析它。除非您必须这样做,否则我不会使用整数。现在您知道了行的开头和整数的开头,您可以将字符串提取为字节,并使用所需的编码将其转换为字符串。

这假设换行符和空格是编码中的一个字节。如果它们是多字节字节,它仍然可以完成。

编辑:以下示例打印...

text: ' someString', number: 8
text: 'some other string', number: -88

代码

ByteBuffer bb = ByteBuffer.wrap(" someString 8\r\nsome other string -88\n".getBytes());
while(bb.remaining()>0) {
    int start = bb.position(),end, ptr;
    for(end = start;end < bb.limit();end++) {
        byte b = bb.get(end);
        if (b == '\r' || b == '\n')
            break;
    }
    // read the number backwards
    long value = 0;
    long tens = 1;
    for(ptr = end-1;ptr>= start;ptr--) {
        byte b = bb.get(ptr);
        if (b >= '0' && b <= '9') {
            value += tens * (b - '0');
            tens *= 10;
        } else if (b == '-') {
            value = -value;
            ptr--;
            break;
        } else {
            break;
        }
    }
    // assume separator is a space....
    byte[] bytes = new byte[ptr-start];
    bb.get(bytes);
    String text = new String(bytes, "UTF-8");
    System.out.println("text: '"+text+"', number: "+value);

    // find the end of the line.
    if (bb.get(end) == '\r') end++;
    bb.position(end+1);
}
于 2011-02-08T20:11:23.810 回答
1

你可以这样尝试:

CharacterIterator it = new StringCharacterIterator(StringBuffer.toString());
for (char c = it.first(); c != CharacterIterator.DONE; c = it.next()) {
    if (Character.isDigit(c)) {
        // character is digit
    } else {
        // character is not-digit
    }
}

或者,如果您愿意,也可以使用正则表达式

String str = StringBuffer.toString();
String numbers = str.replaceAll("\\D", "");
String letters = str.replaceAll("\\W", "");

然后你需要Integer.parseInt()像往常一样对你的字符串中的字符执行numbers

于 2011-02-08T20:09:48.957 回答
0

你在找java.util.Scanner吗?除非您有非常奇特的性能要求,否则应该足够快:

    Scanner s = new Scanner(new File("C:\\test.txt"));
    while (s.hasNext()) {
        String label = s.next();
        int number = s.nextInt();

        System.out.println(number + " " + label);
    }
于 2011-02-08T20:51:00.927 回答