2012-04-17 3 views
1

도움이 필요하며 텍스트 파일을 읽는 방법을 쓰고 있으며 예외가 발생하면 텍스트 파일에 줄을 추가합니다. 예컨대 "**"줄 찾기 i 텍스트 파일

그래서 내가 알아야 할 내가 들여다 방법 또는 무언가 같이, 텍스트 파일의 모든 라인을 읽지 않고 텍스트 파일에서 텍스트의 특정 라인을 확인 할 수있는 방법입니다.

도움을 주시면 감사하겠습니다.

미리 감사드립니다.

+0

파일이 적당히 작 으면 메모리에로드 할 이유가 없습니다. 귀하의 컴퓨터는 아마도 캐시 메모리에있는 몇 MB의 데이터를 처리 할 수 ​​있습니다. – Default

+0

처음에 파일을 처리 한 후 나중에 해당 텍스트 행을 확인 하시겠습니까? – Nick

+1

@ johnnie - 왜 그렇게하고 싶습니까? 일반적으로 파일을 읽을 때 일반적으로 읽고있는 파일을 그대로두고 두십시오. – abhilash

답변

1

을 줄을 읽었으므로 마지막 줄을 읽는 방법을 만들었습니다. 아래 참조 :

public string ReadLastLine(string path) 
     { 
      string returnValue = ""; 
      FileStream fs = new FileStream(path, FileMode.Open); 
      for (long pos = fs.Length - 2; pos > 0; --pos) 
      { 
       fs.Seek(pos, SeekOrigin.Begin);    
       StreamReader ts = new StreamReader(fs); 
       returnValue = ts.ReadToEnd(); 
       int eol = returnValue .IndexOf("\n"); 
       if (eol >= 0) 
       {      
        fs.Close(); 
        return returnValue .Substring(eol + 1); 
       }     
      } 
      fs.Close(); 
      return returnValue ; 
     } 
2

당신은 Any와 함께 File.ReadLines를 사용할 수 있습니다

bool isExcFile = System.IO.File.ReadLines(path).Any(l => l == "**"); 

방법과 같이 다른 readlines 메쏘드와 ReadAllLines은 다음과 같습니다 당신이 readlines 메쏘드를 사용하면 전체 컬렉션을하기 전에 문자열의 컬렉션을 열거 시작할 수 있습니다 반환됩니다; ReadAllLines를 사용하는 경우 배열 에 액세스하기 전에 문자열의 전체 배열이 반환되기를 기다려야합니다. 따라서 매우 큰 파일로 작업 할 때 ReadLines가 더 효율적일 수 있습니다.

0

특수 마커가있는 위치의 색인 (예 : 쉼표로 구분)을 사용하여 별도의 파일을 유지해야합니다. 그런 다음 해당 인덱스 만 읽고 Seek 메서드를 사용하여 파일 스트림의 해당 지점으로 건너 뛸 수 있습니다.

파일이 상대적으로 작 으면 < 50MB가 과도하다고합니다. 인덱스 파일을 유지 관리하는 것보다 더 많은 작업을 수행 할 수 있습니다. 기본적으로 각 행의 파일 스트림에서 읽는 것만으로 여분의 IO 호출 (인덱스 파일 읽기)의 성능을 측정해야합니다.

0

일부 파일을 처리하고 처리 후에 파일의 모든 행을 읽지 않고 "**"기호가 포함 된 파일을 찾습니다.

당신은 추가 할 경우 "**"당신은 같은 것을 할 수있는 파일의 끝 : 나는 파일에 추가 한 행은 항상 마지막이 될 것입니다, 나는 해결책을 발견

using (StreamReader sr = new StreamReader(File.OpenText(fileName))) 
{ 
    sr.BaseStream.Seek(-3, SeekOrigin.End); 
    string endToken = sr.ReadToEnd(); 
    if (endToken == "**\n") 
    { 
     // if needed, go back to start of file: 
     sr.BaseStream.Seek(0, SeekOrigin.Begin); 
      // do something with the file 
    } 
}