2011-08-24 9 views
3

로그 파일의 크기가 10KB 이하 (파일 크기가 최대 2MB까지 증가 할 수 있음)의 파일이 적어도 하나 이상 있는지 확인하고 싶습니다. .......파일에서 문자열을 찾는 가장 빠른 방법

INPUT :이 문자열은

ACTION, 같은 다른 라인에있을 것입니다 ...........

결과 : ... .......

위의 한 그룹이 파일에 존재하면 적어도 알고 있어야합니다. 그리고 나는 이것을 약 100 번 테스트 해 본다. (매번 로그가 다르기 때문에 로그를 다시 읽고 로그를 읽는다.) 그래서 가장 빠르고 베팅하는 방법을 찾고있다.

포럼에서 가장 빠른 방법을 찾아 보았지만 파일이 너무 많아 생각지 않습니다.

Thansk for looking.

+1

10KB는 정말 작습니다. 메모리가 너무 커서/ – NullUserException

답변

3

내가 라인으로 라인을 읽고 조건을 확인한다. 그룹을 본 후에는 그만 둘 수 있습니다. 이렇게하면 전체 파일을 메모리로 읽을 필요가 없습니다.

public bool ContainsGroup(string file) 
    { 
     using (var reader = new StreamReader(file)) 
     { 
      var hasAction = false; 
      var hasInput = false; 
      var hasResult = false; 
      while (!reader.EndOfStream) 
      { 
       var line = reader.ReadLine(); 
       if (!hasAction) 
       { 
        if (line.StartsWith("ACTION:")) 
         hasAction = true; 
       } 
       else if (!hasInput) 
       { 
        if (line.StartsWith("INPUT:")) 
         hasInput = true; 
       } 
       else if (!hasResult) 
       { 
        if (line.StartsWith("RESULT:")) 
         hasResult = true; 
       } 

       if (hasAction && hasInput && hasResult) 
        return true; 
      } 
      return false; 
     } 
    } 

이 코드를 확인 후 조치를 입력 한 및 결과와 다음을 시작하는 라인이있는 경우 : 이것처럼. 그 순서가 중요하지 않은 경우 if() else if() 수표를 생략 할 수 있습니다. 줄이 문자열로 시작하지 않으면 StartsWithContains으로 바꿉니다.

+0

감사합니다. 나는 이것으로 갈 것이다. – user393148

2

How to Read Text From a File을 살펴보십시오. String.Contains() 방법을 살펴볼 수도 있습니다.

기본적으로 모든 파일을 반복합니다. 각 파일에 대해 한 줄씩 읽고 특별한 "섹션"중 하나가 포함 된 줄이 있는지 확인하십시오.

2

효율면에서 텍스트 파일을 선택할 필요가 없습니다. 가장 쉬운 방법은 확실히 각 데이터 라인을 반복하는 것입니다. 문자열의 한 줄을 잡을 때 공백으로 나눕니다. 그런 다음 일치하는 단어가 나올 때까지 단어를 찾으십시오. 그런 다음 필요한 것을하십시오.

여기에 그것을 할 한 가지 가능한 방법이다 나는 C#에서 그것을 할 방법을 알고하지 않습니다하지만 VB에서이 ... 같은

3

을하는 데 도움이

Dim yourString as string 
Dim words as string() 
Do While objReader.Peek() <> -1 
    yourString = objReader.ReadLine() 
    words = yourString.split(" ") 
    For Each word in words() 
     If Myword = word Then 
     do stuff 
     End If 
    Next 
Loop 

희망 뭔가 될 것이다 :

StreamReader sr; 
string fileContents; 

string[] logFiles = Directory.GetFiles(@"C:\Logs"); 

foreach (string file in logFiles) 
{ 

    using (StreamReader sr = new StreamReader(file)) 
    { 

     fileContents = sr.ReadAllText(); 

     if (fileContents.Contains("ACTION:") || fileContents.Contains("INPUT:") || fileContents.Contains("RESULT:")) 
     { 
      // Do what you need to here 
     } 

    } 
} 

정확한 구현 요구 사항에 따라 몇 가지 변형을해야 할 수 있습니다 (예 : 단어가 두 줄에 걸쳐 있고 단어가 단어로 시작해야하는지 등).

추가

대체 라인 별 검사 :

StreamReader sr; 
string[] lines; 

string[] logFiles = Directory.GetFiles(@"C:\Logs"); 

foreach (string file in logFiles) 
{ 

    using (StreamReader sr = new StreamReader(file) 
    { 

     lines = sr.ReadAllLines(); 

     foreach (string line in lines) 
     {   
      if (line.Contains("ACTION:") || line.Contains("INPUT:") || line.Contains("RESULT:")) 
      { 
       // Do what you need to here 
      } 
     } 

    } 
} 
+0

라인 단위로 파일을 처리 했으므로 오류가 발생할 수 있습니다. 이자형.g : "AC" "TION"이 다른 행에있을 수 있습니다 (코더가 텍스트 파일에주의를 기울이지 않은 경우). String.Contains가 부족하면 가장 좋은 기능입니다. – icaptan

+0

@icaptan - 예. 그래서 키워드가 두 개 이상의 행으로 분할 된 경우 ReadAllText 예제를 먼저 작성한 것입니다. – Tim

+1

일치하는 텍스트가 두 개의 다른 줄에 있으면 줄 문자로 구분되며 여전히 일치하지 않습니다. 먼저 줄 바꿈을 제거해야합니다. – ChrisWue

관련 문제