2012-06-12 4 views
13

코드 아래FileHelpers : 고정 폭 텍스트를 읽는 첫 번째와 마지막 행을 생략하는 방법

먼저 ASP .NET MVC2에 FileHelpers를 사용하여 고정 폭 업로드 된 파일의 내용 텍스트 파일을 읽고 마지막 줄의 길이가 작고 ReadStream 원인 데 사용됩니다 이로 인한 예외. 다른 모든 줄은 적절한 고정 폭을 갖습니다. 첫 번째 줄과 마지막 줄 또는 다른 방법으로 예외없이 데이터를 읽는 방법은 무엇입니까?

[FixedLengthRecord()] 
    class Bank 
    { 
     [FieldFixedLength(4)] 
     public string AINETUNNUS; 
     [FieldFixedLength(16)] 
     public string TEKST1; 
     [FieldFixedLength(3)] 
     public string opliik; 
     [FieldFixedLength(2)] 
     public string hinnalis; 
    }; 

    [AcceptVerbs(HttpVerbs.Post)] 
    [Authorize] 
    public ActionResult LoadStatement(HttpPostedFileBase uploadFile) 
    { 

     FileHelperEngine engine = new FileHelperEngine(typeof(Bank)); 
     var res = engine.ReadStream(new StreamReader(uploadFile.InputStream, 
      Encoding.GetEncoding(1257))) as Bank[]; 
    } 

답변

31

이러한 속성

IgnoreFirst

를 사용할 수 있습니다.

[IgnoreFirst(1)] 
public class OrdersVerticalBar 
{ ... 

IgnoreLast은 : 행의 번호가 파일의 끝에서 무시되거나 엔진이 그것을 읽을 때 스트리밍 수를 나타냅니다.

[IgnoreLast(1)] 
public class OrdersVerticalBar 
{ ... 

나중에

engine.HeaderText 
engine.FooterText 
+0

감사합니다. 실제로 파일은 문제의 설명에 따라 고정 너비와 각 필드가 별도의 줄에있는 레코드 형식의 두 가지 형식이 될 수 있습니다. 두 필드 모두 필드가 다르므로 두 가지 다른 읽기 모드를 사용해야합니다. 고정 폭 형식은 모든 행의 시작에서 항상 "VV"를 포함합니다. 읽기 전에 스트림을 검사하고 형식에 따라 다른 읽기 모드를 적용하는 방법은 무엇입니까? – Andrus

+0

클래스 대신에 IgnoreFirst/IgnoreLast를 요청하는 방법? – zerohero

+1

engine.Options.IgnoreFirstLines = 1 – zerohero

3

BeforeReadRecord 이벤트를 사용하여 회선의 형식을 확인할 수 있습니다. 첫 x 째 레코드 인 경우, 이벤트 데이터에 SkipThisRecord 등록 정보를 설정하십시오. 마지막 레코드인지 확인하는 것은 문제가 있지만 길이 나 형식을 확인하면됩니다. 물론, 잘못된 레코드로 인한 오류를 잡는 것을 막을 수 있습니다.

또 다른 가능성은 File.ReadAllLines을 사용하여 전체 파일을 메모리에로드하는 것입니다. 결과 배열의 첫 번째 항목과 마지막 항목을 제거한 다음 문자열로 다시 설정하고 ReadString을 호출합니다. 또는 문자열을 MemoryStream에 쓰고 ReadStream으로 전화하십시오. 파일의 시작에서 라인의 숫자는 무시하는 표시 또는 엔진이 그것을 읽을 때 스트리밍 :

+0

404과 같은 작업을 수행 할 수 있습니다. – justSteve

+1

@justSteve : 깨진 링크가 수정되었습니다. FileHelpers 설명서는 http://www.filehelpers.net/docs/html/R_Project_FileHelpers.htm에 있습니다. –

0

최고는 [IgnoreFirst] 속성 클래스를 장식하는 것입니다와 값에 액세스 할 수 있습니다. 어떤 이유로 당신이 속성을 추가 할 수없는 경우

당신은 모두 링크에이

var engine = new FileHelperEngine<T>(); 
engine.BeforeReadRecord += (e, args) => 
{ 
    if (args.LineNumber == 1) 
     args.SkipThisRecord = true; 
}; 
관련 문제