2012-12-24 4 views
1

에있는 split로 반환했습니다. 내 아파치 로그를 읽고 그것에 대한 처리를 시도하고 있습니다. 내가 그렇게 참조하는 로그 라인을 포함하는 문자열 분할 함수를 사용합니다. 나는 그 선들을 제거하고 싶다. 아래 코드는 내가 가지고있는 것을 보여줍니다. "127.0.0.1"만 제거되지만 모든 "192.168.1.x"행이 나타납니다.각 항목에 대한 텍스트 검색 줄을 C#

모든 분할 문자열을 어떻게 제거합니까? 그런 다음

 public void GetTheLog() 
    { 
     string path = "c:\\program files\\Zend\\apache2\\logs\\access.log"; 
     string path2 = @"access.log"; 
     int pos; 
     bool goodline = true; 

     string skipIPs = "127.0.0.1;192.168.1.100;192.168.1.101;192.168.1.106;67.240.13.70"; 
     char[] splitchar = { ';' }; 
     string[] wordarray = skipIPs.Split(splitchar); 
     FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); 
     StreamReader reader = new StreamReader(fs); 
     TextWriter tw = new StreamWriter(path2); 

     while (!reader.EndOfStream) 
     { 
      string line = reader.ReadLine(); 

      // initialize goodline for each line of reader result 
      goodline = true; 
      for (j = 0; j < wordarray.Length; j++) 
      { 
       pos = -10; 
       srch = wordarray[j]; 
       ln = line.Substring(0,srch.Length); 
       pos = ln.IndexOf(srch); 
       if (pos >= 0) goodline = false; 
      } 
      if (goodline == true) 
      { 
       tw.WriteLine(line); 
       listBox2.Items.Add(line); 
      } 
     } 

     // Clean up 
     reader.Close(); 
     fs.Close(); 
     listBox1.Items.Add(path2); 
     tw.Close(); 
    } 

답변

1
var logPath = @"c:\program files\Zend\apache2\logs\access.log"; 
var skipIPs = "127.0.0.1;192.168.1.100;192.168.1.101;192.168.1.106;67.240.13.70"; 
var filters = skipIPs.Split(';'); 
var goodlines = File.ReadLines(logPath) 
        .Where(line => !filters.Any(f => line.Contains(f))); 

할 수 있습니다

File.WriteAllLines(@"access.log", goodlines); 

그리고 당신은 목록 상자에 줄을 버리는 것처럼 skipIPs 그냥 정적이기 때문에 그것은 또한,

listBox2.Items.AddRange(goodlines.Select(line=> new ListItem(line)).ToArray()); 

또한 본다 문자열, 조금만 리팩토링 할 수 있습니다.

var filters = new []{"127.0.0.1","192.168.1.100","192.168.1.101",...}; 
+0

고마워요. 귀하의 회신을 약간 수정해야했습니다. 나는 "파일을 다른 프로그램에서 사용 중입니다"라는 오류 메시지가 나타나서 원래 파일을 임시 파일로 다운로드 한 다음 임시 파일에 적용하여 제안 사항을 추가했습니다. 그 트릭을 했어! –

+0

@DaveJaswaye 슈퍼, 듣기에 다행입니다. 당신이 새로운 사람 일 때 이것을 올바른 대답으로 표기하거나 투표를하는 것에 대해 생각해보십시오. – Bert

0

arrrrrr의 소음은

okh는 현재 파일에서 skipIPs에 존재하는 모든 IP를 제거 할 경우 나 해보자 ... 당신이 원하는 것을 얻을. 루프

다음 간단하게 사용할 수 있습니다

....
pos = ln.IndexOf(srch); 
    if (pos >= 0) goodline = false; 

if(ln==srch) 
    { 
    goodline = false; 
    } 

대신

당신의 내부.

당신을 싫어합니다. :)

+0

감사합니다. (Duhhh!) 나는 내가 복잡한 것을 끝내 었다고 생각한다. 항상 프로그램을 다시로드하는 것에 지쳤습니다. –

관련 문제