在java中,我想要快速解析包含异构数据(数字和字符)的文件。
我一直在读关于ByteBuffer和内存映射文件的文章。
我可以复制它,但在解析数据时就会变得很棘手。我想分配不同的字节。但是它会变得依赖编码吗?
如果文件的格式为,例如:
someString 8
some other string 88
如何将其解析为String或Integer对象?
谢谢!
乌多。
发布于 2011-02-09 04:11:24
假设您的格式类似于
{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);
}发布于 2011-02-09 04:09:49
你可以这样尝试:
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
}
}或者,如果您愿意,也可以使用regex
String str = StringBuffer.toString();
String numbers = str.replaceAll("\\D", "");
String letters = str.replaceAll("\\W", "");然后,需要像往常一样对字符串numbers中的字符执行Integer.parseInt()。
发布于 2011-02-09 04:51:01
你在找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);
}https://stackoverflow.com/questions/4937752
复制相似问题