Java, ByteBuffer для анализа данных из файла - PullRequest
0 голосов
/ 08 февраля 2011

В Java я хочу быстро проанализировать файл с разнородными данными (числами и символами).

Я читал о ByteBuffer и отображенных в память файлах.

Я могу скопировать его, но при разборе данных становится сложно.Я хотел бы сделать это, выделяя различные байты.Но тогда это становится зависимым от кодировки?

Если формат файла, например:

someString 8<br> some other string 88

Как я могу разобрать его в Stringили Integer объекты?

Спасибо!

Удо.

Ответы [ 3 ]

2 голосов
/ 08 февраля 2011

Предполагая, что ваш формат похож на

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

Вам нужно найти новую строку и работать в обратном направлении, пока не найдете первый пробел. Вы можете самостоятельно расшифровать число и превратить его в int или превратить в строку и проанализировать. Я бы не использовал Integer, если бы вам не пришлось. Теперь вы знаете, где находится начало строки и начало целого числа, вы можете извлечь строку в виде байтов и преобразовать ее в строку, используя желаемую кодировку.

Это предполагает, что символ новой строки и пробел являются одним байтом в вашей кодировке. Было бы сложнее, если бы они были многобайтовыми байтами, это еще можно сделать.

РЕДАКТИРОВАТЬ: следующий пример печатает ...

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);
}
1 голос
/ 08 февраля 2011

Вы можете попробовать это так:

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.

0 голосов
/ 08 февраля 2011

Вы ищете 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);
    }
...