2013-10-29 3 views
1

. NET 4.5 응용 프로그램 에서 로그 파일의 첫 번째 줄과 마지막 줄을 읽어야합니다.
로그 파일에는 모든 행에 타임 스탬프가 있으며 막내 (첫 번째 줄)와 가장 오래된 (마지막 줄) 타임 스탬프를 찾고 싶습니다. 이것은 어려운 작업이 아니지만 그것을 수행하는 영리한 방법이 있는지 궁금합니다.파일의 첫 번째 줄과 마지막 줄을 읽습니다.

string firstLine = File.ReadLines(logFile).Skip(1); 
string lastLine = File.ReadLines(logFile).Last(); 

이 매우 간단한 코드에 대한 개선이있을 수 :

현재 구현은 다음과 같이 (첫 번째 줄은 따라서 Skip() 비어 있기 때문에 실제로 로그 파일의 두 번째 줄 필요) 찾습니다 ?

+1

"개선"을 정의합니다. 하비브 (Habib)의 대답은 작은 파일에도 효과적입니다. 매우 큰 파일의 경우 오히려 느려질 것입니다. 그러나 속도를 높이는 일과 관련된 일이 있습니다. 바이너리로 파일의 끝을 읽고 결국 마지막 줄의 시작 부분으로 거슬러 올라갑니다. 정말로 관심이 있으시면 http://stackoverflow.com/a/452945/56778을 참조하십시오. –

+0

건너 뛰기 (1)는 첫 번째 요소 다음에 나머지 요소를 반환 함을 의미합니다. 나는 First()를 언급 한 것 같군요? – Measuring

+0

@JimMischel 실행 시간이 향상되었습니다. 메모리는 가까운 초입니다. 가장 일반적인 경우에 대해 최적화하는 것이 항상 최선이므로 파일의 대다수는 ~ 5MB 이하이고 극단적 인 경우에는 약 25MB (~ 200k 줄)라고 할 수 있습니다. 나는 또한 이들 파일 중 20-30 개를 파싱 할 수있다. 나는 이전에 읽는 것을 뒤에서 보았고,보기가 '다소 까다 롭다'고 동의하고 가능하다면 그것을 피할 것이다. 현재의 해결책은 어느쪽으로도 느리지 않습니다. – valsidalv

답변

6

IEnumerable<string>에서 한 번 읽은 다음 두 번째 줄과 마지막 줄에 사용하십시오. 먼저 읽고 두 번째, 당신은 두 번 파일을 읽을 수있는 사이에 파일이 수정 될 것으로 예상되면 현재 코드에서

var lines = File.ReadLines(logFile); 
string firstLine = lines.Skip(1); 
string lastLine = lines.Last(); 

당신은 두 번 읽기를하고 있습니다.

+0

'lines'은 배열이 아니며,'IEnumerable '입니다. 배열로 읽는 것보다 낫습니다. 문서를 조금만 만들면됩니다. –

+0

@JoelRondeau, 맞아, 나는 그것을 ReadAllLines와 섞었다. – Habib

+0

그래서'ReadLines'를 두 번 호출 할 때 무슨 일이 벌어 졌습니까? 전체 파일을 두 번 읽으시겠습니까? – valsidalv

관련 문제