2012-07-04 10 views
1
을 사용하여 다른 문자로 저장

300,000 행의 .txt 파일이 있습니다. 해당 파일에서 특정 문자열 (줄)을 추출하고 다른 .txt에 저장하거나 추출 된 줄만 추출하는 방법이 있습니까? 나는 모든 요청에 ​​걸리는 시간과 함께 일부 요청을 저장하는 로그 파일에 대해 이야기합니다. 내가 원하는 것은 각 요청의 시간 만 추출한 다음 평균 시간을 계산합니다.파일에서 문자열을 추출하고 C#

너희들은 내가 무슨 말을하는지 이해하기를 바랍니다.

편집 : .txt 파일의 형식은 일반 텍스트이며 모든 요청은로 끝납니다. 그래서 나는 가지고있다 :

Starting date 
//body of response from server 
End date 
Time: 3150,0792 ms <--- time taken 

나는 10 000 요청과 10 000 응답을 가지고있다. 나는 오직 .txt 파일 전체를 스크롤하고 매 시간마다 수작업으로 많은 시간을 들일 것이므로 각각의 시간 만 추출해야한다.

+3

포맷을 볼 수 있도록 txt 파일의 몇 줄은 어떨까요? 그러면 압축을 푼 텍스트 파일을 어떻게 보이게 할 것인지 예가 표시됩니다. –

+1

[무엇을 시도 했습니까?] (http://whathaveyoutried.com)? ['StreamReader.ReadLine()'] (http://msdn.microsoft.com/en-us/library/system.io.streamreader.readline.aspx)를 반복하면 유용합니다. – CodeCaster

+2

@CodeCaster, 그가 300 000 개의 행을 가지고 있다면 좋지 않습니다. 그는 한 번에 두 줄을 읽는 것이 낫습니다. –

답변

3
private void extract_lines(string filein, string fileout) 
    { 
     using (StreamReader reader = new StreamReader(filein)) 
     { 
      using (StreamWriter writer = new StreamWriter(fileout)) 
      { 
       string line; 
       while ((line = reader.ReadLine()) != null) 
       { 
        if (line.Contains("what you looking for")) 
        { 
         writer.Write(line); 
        } 
       } 
      } 
     } 
    } 
+0

실제로 이것은 나가 필요로하는 모두를 추출한다. –

4

당신은 다른 사람들이 이미 말했듯이,이 형식의 예를 가지고 도움이 될 것

using (StreamWriter sw = File.AppendText("File2.txt")) 
{ 
    foreach (string line in File.ReadLines(@"d:\File1.txt")) 
    { 
     if (line.Contains("TheWordInLine"))//This is the line you want by matching something 
     { 
       sw.WriteLine("line); 
     } 
    } 
} 
+3

'StreamWriter'를 루프 외부의 스코프에서 한 번만 생성하는 것이 더 좋지 않을까요? – spender

+1

@spender 나는 당신과 동의하고 게시물을 업데이트했습니다 – HatSoft

+0

좋아,하지만 왜 파일'시간 :'에? 'Time : Something ms'이되어야할까요? –

2

파일 클래스를 달성 할 수있다. 어쨌든 어쩌면 유용한이 도구를 찾을 수 있습니다

http://filehelpers.sourceforge.net/

내가 직장에서 사용하고 당신이 분석하고 다른 파일 형식으로 작성할 수 있습니다. 는 StreamReader/StreamWriter 사용할 수 있습니다, 그것은

3

물론 도움이되기를 바랍니다 :이 줄 몇 가지를 만족하면

using (var input = File.OpenText("input.log")) 
using (var output = File.CreateText("output.log")) 
{ 
    string line; 
    while ((line = input.ReadLine()) != null) 
    { 
     if (SomeConditionOnLine(line)) 
     { 
      output.WriteLine(line); 
     } 
    } 
} 

이 한 번에 따라서 메모리에 단 하나의 라인을 갖는 라인으로 입력 파일 라인을 읽고합니다 당신이 찾고있는 조건을 출력 파일에 기록하십시오. 그것은 빠르며 메모리를 거의 소비하지 않으며 거대한 입력 파일에서도 작동 할 것입니다.

+0

이 작품도 있지만,'Time' 만 씁니다. '시간 : 시간 ms'여야합니다. 또한 시간을 가지고가는 방법 –

4

당신은 MemoryMappedFile와 결합 TextReader를 사용하여 시도 할 수 있습니다. MMF는 대용량 파일에 액세스 할 수있게하며 텍스트 판독기를 사용하면 한 줄씩 파일을 처리 할 수 ​​있습니다.

using (var mmf = 
      MemoryMappedFile.CreateFromFile(@"c:\large.data", FileMode.Open 
{ 
    using (MemoryMappedViewStream stream = mmf.CreateViewStream()) 
    { 
     TextReader tr = new StreamReader(stream); 
     while ((line = sr.ReadLine()) != null) 
     { 
      Console.WriteLine(line); 
     } 
    } 
} 
관련 문제