2012-12-19 6 views
0

텍스트 파일의 특정 텍스트 줄을 검색하려고합니다. 찾고자하는 텍스트가 특정 라인에 있다면, 그 라인에 더 많은 내용을 읽고 싶습니다.특정 줄의 텍스트 파일 검색

지금까지 내가 찾고있는 태그가 3 개 있습니다.

@public 
@private 
@virtual 

나는 줄에 다음 중 하나를 찾을 경우, 나는이 같은 라인을 가질 수있다 예를 들어, 그래서 다음에 오는 것을 읽고 싶은 : 내가 태그 내가하다고 판단되면

@public double getHeight(); 

을 발견되면 @public 다음 나는 세미콜론에 도달 할 때까지 공백 뒤에 다음과 같은 부분을 가져 가야합니다. 문제는, 실제로는 꽤 이상하게 보이지는 않지만 대용량 파일이나 행의 여러 파일에 대해 장기적으로 좋지 않은 것 같은 charAt(..)을 과도하게 사용하지 않으면 효율적인 방법을 생각할 수 없다는 것입니다 .

저는 현재 어떻게 할 수 있는지 이해할 수 없으므로이 문제를 효율적으로 해결하는 데 도움을 드리고 싶습니다. 코드 자체는 헤더 파일을 나중에 생성하기 위해 C++ 파일의 주석을 구문 분석하는 데 사용됩니다. 의사 코드 부분은 내가 붙어있는 곳입니다. 어떤 사람들은 BufferedReader를 제안하고, 다른 사람들은 Scanner라고합니다. BufferedReader를 대체하는 것으로 보이는 Scanner와 함께갔습니다.

public void run() { 
    Scanner scanner = null; 
    String filename, path; 
    StringBuilder puBuilder, prBuilder, viBuilder; 
    puBuilder = new StringBuilder(); 
    prBuilder = new StringBuilder(); 
    viBuilder = new StringBuilder(); 
    for(File f : files) { 
     try { 
      filename = f.getName(); 
      path = f.getCanonicalPath(); 
      scanner = new Scanner(new FileReader(f)); 
     } catch (FileNotFoundException ex) { 
      System.out.println("FileNotFoundException: " + ex.getMessage()); 
     } catch (IOException ex) { 
      System.out.println("IOException: " + ex.getMessage()); 
     } 
     String line; 
     while((line = scanner.nextLine()) != null) { 
      /** 
      * Pseudo Code 
      * if @public then 
      *  puBuilder.append(line.substring(after white space) 
      *  + line.substring(until and including the semicolon); 
      */ 
     } 
    } 
} 
+0

한 번에 한 줄씩 읽는 것 외에 다른 작업을 수행하려는 경우 스캐너를 사용하는 것이 좋습니다. 귀하의 경우, 한 번에 한 단어를 읽을 수있는 것이 유용 할 것이라고 생각합니다. 즉, 'Scanner.next()'입니다. 그러면 주석이 그 다음 단어와 같은 줄에있을 필요는 없습니다. –

+0

'charAt'? 'indexOf' (';'검색을위한)와'substring'은 여러분이 필요로하는 모든 String 메소드입니다. 또한 이것은 숙제 나 현실 세계를위한 것입니까? 실제 파싱은 그것보다 훨씬 복잡하기 때문에 ('@ virtual' 다음에 새로운 라인이 생기게됩니까?) – SJuan76

+0

@ SJuan76 이것은 취미 프로젝트입니다. – OmniOwl

답변

1
String tag = ""; 
if(line.startsWith("@public")){ 
    tag = "@public"; 
}else if{....other tags....} 

line = line.substring(tag.length(), line.indexOf(";")).trim(); 

이것은 당신에게 (이 경우에는 공개) 태그의 끝에서가는 문자열을 제공하고 세미콜론 앞의 문자로, 다음 오프 트림 끝 부분의 공백.

+0

'@ public'은 문자열에 포함되지 않을 것입니다, 맞습니까? – OmniOwl

+0

문자열의 해당 "위치"에서 부분 문자열이 올바르게 시작됩니다. 예를 들어. String s = "cat"이면 cat.substring (1,2)는 "a"를 생성합니다. http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/String.html#substring(int, int) – HJM

+0

문자열이 예를 들어 시작하는 경우 문제가되지 않습니다. 공백이 4 개입니까? 아니면'startsWith()'에 의해 공백이 무시 될까요? – OmniOwl

2

나는 당신을 오해하고 있을지 모르지만 ... String.contains()을 찾고 계십니까?

if(line.contains("@public")){} 
+0

정말 간단합니까? 달리 솔루션을 살펴볼 때, 그들은 정규 표현식 패키지에 대해 이야기하기 시작했습니다. – OmniOwl

+0

@Vipar 또한 정규 표현식을 사용할 수도 있습니다. 당신의 경우에 더 편리해질 것입니다 – Smit

1
if (line.startsWith("@public")) { 
    ... 
} 
0

오픈 소스 라이브러리를 사용할 수 있다면 apache common-io 및 common-lang 라이브러리를 사용하는 것이 좋습니다. 이것들은 당신을 훨씬 더 단순하게 만들어주는 자바 라이브러리를 광범위하게 사용합니다.

String text = null; 
InputStream in = null; 
List<String> lines = null; 
for(File f : files) { 
    try{ 
     in = new FileInputStream(f); 
     lines = IOUtils.readLines(in); 
     for (String line: lines){ 
      if (line.contains("@public"){ 
       text = StringUtils.substringBetween("@public", ";"); 
       ... 
      } 
     } 

    } 
    catch (Exception e){ 
     ... 
    } 
    finally{ 
     // alway remember to close the resource 
     IOUtils.closeQuietly(in); 
    } 
} 
관련 문제