Java顺序解析文件中的信息
假设我有一个结构如下的文件: 第0行:Java顺序解析文件中的信息,java,file,parsing,Java,File,Parsing,假设我有一个结构如下的文件: 第0行: 354858一些重要的字符串AA其他一些东西 这应该被忽略 第1行: 543788另一个重要的字符串AA其他内容 一些应该被忽略的东西 等等 现在,我想获得示例中标记的信息(请参见灰色背景)。当信息字符串长度不同时,序列AA始终存在(并且可以用作中断并跳到下一行) 解析信息的最佳方式是什么?带有的缓冲读取器,如果,那么,else或者有某种解析器,您可以分辨,读取一些长度XYZ,然后将所有内容读入字符串,直到找到AA,然后跳过行。我会逐行读取文件,并将每一行
354858
一些重要的字符串
AA其他一些东西
这应该被忽略
第1行:
543788
另一个重要的字符串
AA其他内容
一些应该被忽略的东西
等等
现在,我想获得示例中标记的信息(请参见灰色背景)。当信息字符串长度不同时,序列AA始终存在(并且可以用作中断并跳到下一行)
解析信息的最佳方式是什么?带有
的缓冲读取器,如果,那么,else
或者有某种解析器,您可以分辨,读取一些长度XYZ,然后将所有内容读入字符串,直到找到AA,然后跳过行。我会逐行读取文件,并将每一行与正则表达式匹配。我希望下面代码中的注释足够详细
// The pattern to use
Pattern p = Pattern.compile("^([0-9]+)\\s+(([^A]|A[^A])+)AA");
// Read file line by line
BufferedReader br = new BufferedReader(new FileReader(myFile));
String line;
while((line = br.readLine()) != null) {
// Match line against our pattern
Matcher m = p.matcher(line);
if(m.find()) {
// Line is valid, process it however you want
// m.group(1) contains the number
// m.group(2) contains the text between number and AA
} else {
// Line has invalid format (pattern does not match)
}
}
对我使用的正则表达式(模式)的解释:
更新为对评论的回复:
如果每行前面都有一个|
字符,则表达式如下所示:
^\|([0-9]+)\s+(([^A]|A[^A])+)AA
"^\\|([0-9]+)\\s+(([^A]|A[^A])+)AA"
在JAVA中,您需要像这样对其进行转义:
^\|([0-9]+)\s+(([^A]|A[^A])+)AA
"^\\|([0-9]+)\\s+(([^A]|A[^A])+)AA"
字符
|
在正则表达式中有特殊含义,必须进行转义。如果没有更多信息,就无法告诉您哪个字符最适合您的问题
一个解决办法可能是
String s = "354858 Some String That Is Important AA OTHER STUFF SOMESTUFF THAT SHOULD BE IGNORED";
String[] split = s.substring(0, s.indexOf(" AA")).split(" ", 2);
System.out.println("split = " + Arrays.toString(split));
输出
split = [354858, Some String That Is Important]
使用正则表达式:
+?(?=AA)
检查这里有一个解决方案:
public static void main(String[] args) {
InputStream source; //select a text source (should be a FileInputStream)
{
String fileContent = "354858 Some String That Is Important AA OTHER STUFF SOMESTUFF THAT SHOULD BE IGNORED\n" +
"543788 Another String That Is Important AA OTHER STUFF SOMESTUFF THAT SHOULD BE IGNORED";
source = new ByteArrayInputStream(fileContent.getBytes(StandardCharsets.UTF_8));
}
try(BufferedReader stream = new BufferedReader(new InputStreamReader(source))) {
Pattern pattern = Pattern.compile("^([0-9]+) (.*?) AA .*$");
while(true) {
String line = stream.readLine();
if(line == null) {
break;
}
Matcher matcher = pattern.matcher(line);
if(matcher.matches()) {
String someNumber = matcher.group(1);
String someText = matcher.group(2);
//do something with someNumber and someText
} else {
throw new ParseException(line, 0);
}
}
} catch (IOException | ParseException e) {
e.printStackTrace(); // TODO ...
}
}
您可以使用正则表达式,但如果您知道每一行都包含
AA
,并且您希望内容最多为AA
,您只需执行substring(int,int)
即可将行中的部分设置为AA
public List read(Path path) throws IOException {
return Files.lines(path)
.map(this::parseLine)
.collect(Collectors.toList());
}
public String parseLine(String line){
int index = line.indexOf("AA");
return line.substring(0,index);
}
下面是非Java8版本的read
public List read(Path path) throws IOException {
List<String> content = new ArrayList<>();
try(BufferedReader reader = new BufferedReader(new FileReader(path.toFile()))){
String line;
while((line = reader.readLine()) != null){
content.add(parseLine(line));
}
}
return content;
}
公共列表读取(路径路径)引发IOException{
列表内容=新建ArrayList();
try(BufferedReader=new BufferedReader(new FileReader(path.toFile())){
弦线;
而((line=reader.readLine())!=null){
content.add(parseLine(line));
}
}
返回内容;
}
您可以逐行读取文件并排除包含AA字符序列的部分
:
final String charSequence = "AA";
String line;
BufferedReader r = new BufferedReader(new InputStreamReader(new FileInputStream("yourfilename")));
try {
while ((line = r.readLine()) != null) {
int pos = line.indexOf(charSequence);
if (pos > 0) {
String myImportantStuff = line.substring(0, pos);
//do something with your useful string
}
}
} finally {
r.close();
}
你想要的叫什么。这就是我要找的,谢谢!是否确定
AA
不会出现在重要的字符串中?是的。AA只是一个符号,是一种特定的模式,在任何时候都只出现一次。@m0skit0,强制引用自:“有些人在遇到问题时,会认为‘我知道,我会使用正则表达式。现在他们有两个问题’:)谢谢你的示例,我现在需要研究一下正则表达式。@Flatron欢迎你,我更新了我的答案并添加了对表达式的解释。我有一个问题,我真的不想要复制和粘贴解决方案,但对于学习和测试它是有帮助的。当我复制你的代码时,我得到一个错误“无效的转义序列(有效的是\b\t\n\f\r\“\'\\”)”
,用于模式“^([0-9]+)\s+([^A];A[^A])+)AA“
。我遗漏了什么吗?I importetjava.util.regex.Pattern代码>但这没有帮助。这是不是意味着AA后面少了些什么?哦,对不起,我的错。我会更新我的问题\s
应该是\\s
。好吧,我现在遇到了另一个问题:我在每个liune中的第一个字符是一个|(pipe),当然,上面提到的表达式不适用于此。我如何设置这个条件,使它在每一行的开头都接受|?我试着这样添加它:^([0-9]+)\\s+([^A]| A[^A])+)AA
和m/^([0-9]+)\\s+([^A]| A[^A])AA
。