Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java顺序解析文件中的信息_Java_File_Parsing - Fatal编程技术网

Java顺序解析文件中的信息

Java顺序解析文件中的信息,java,file,parsing,Java,File,Parsing,假设我有一个结构如下的文件: 第0行: 354858一些重要的字符串AA其他一些东西 这应该被忽略 第1行: 543788另一个重要的字符串AA其他内容 一些应该被忽略的东西 等等 现在,我想获得示例中标记的信息(请参见灰色背景)。当信息字符串长度不同时,序列AA始终存在(并且可以用作中断并跳到下一行) 解析信息的最佳方式是什么?带有的缓冲读取器,如果,那么,else或者有某种解析器,您可以分辨,读取一些长度XYZ,然后将所有内容读入字符串,直到找到AA,然后跳过行。我会逐行读取文件,并将每一行

假设我有一个结构如下的文件:

第0行:

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 importet
java.util.regex.Pattern但这没有帮助。这是不是意味着AA后面少了些什么?哦,对不起,我的错。我会更新我的问题
\s
应该是
\\s
。好吧,我现在遇到了另一个问题:我在每个liune中的第一个字符是一个|(pipe),当然,上面提到的表达式不适用于此。我如何设置这个条件,使它在每一行的开头都接受|?我试着这样添加它:
^([0-9]+)\\s+([^A]| A[^A])+)AA
m/^([0-9]+)\\s+([^A]| A[^A])AA