在java中,我想快速解析一个包含异构数据(数字和字符)的文件。
我一直在阅读ByteBuffer
和内存映射文件。
我可以复制它,但是在解析数据时它变得很棘手。我想分配各种字节。但它变得依赖于编码?
如果文件的格式是,例如:
someString 8
some other string 88
如何将其解析为String
或Integer
对象?
谢谢!
你做。
在java中,我想快速解析一个包含异构数据(数字和字符)的文件。
我一直在阅读ByteBuffer
和内存映射文件。
我可以复制它,但是在解析数据时它变得很棘手。我想分配各种字节。但它变得依赖于编码?
如果文件的格式是,例如:
someString 8
some other string 88
如何将其解析为String
或Integer
对象?
谢谢!
你做。
假设您的格式类似于
{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);
}
你可以这样尝试:
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
。
你在找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);
}