在java中,我想快速解析具有异构数据(数字和字符)的文件。
我一直在阅读ByteBuffer
和内存映射文件。
我可以复制它,但在解析数据时变得棘手。我想分配各种字节。但它变得依赖于编码?
如果文件的格式是,例如:
someString 8
some other string 88
如何将其解析为String
或Integer
个对象?
谢谢!
乌
答案 0 :(得分:2)
假设您的格式类似于
{string possibly with spaces} {integer}\r?\n
您需要搜索换行符,然后向后工作直到找到第一个空格。您可以自己解码数字并将其转换为int
或将其转换为字符串并解析它。除非必须,否则我不会使用整数。现在您知道了行的起始位置和整数的开始,您可以将String作为字节提取并使用所需的编码将其转换为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);
}
答案 1 :(得分: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
。
答案 2 :(得分: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);
}