2012-06-12 15 views
13

kod poniżej służy do odczytu zawartości stałej szerokości przesłany plik plik tekstowy za pomocą FileHelpers w ASP .NET MVC2FileHelpers: Jak pominąć pierwszy i ostatni wiersz czyta stały tekst szerokości maksymalnie

Pierwsza i ostatnia linia długości są mniejsze i przyczyny ReadStream wyjątek z tego powodu. Wszystkie pozostałe wiersze mają odpowiednią stałą szerokość. Jak pominąć pierwszą i ostatnią linię lub inny sposób odczytu danych bez wyjątku?

[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[]; 
    } 

Odpowiedz

31

Można użyć tych atrybutów

IgnoreFirst: wskazuje numery linii mają być ignorowane na początku pliku lub strumienia, gdy silnik ją przeczytać.

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

IgnoreLast: wskazuje numery linii mają być ignorowane przy końcu pliku lub strumienia, gdy silnik ją przeczytać.

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

Można uzyskać dostęp do wartości później

engine.HeaderText 
engine.FooterText 
+0

Dziękuję. W rzeczywistości pliki mogą mieć dwa różne formaty: stałą szerokość opisaną w pytaniu oraz w formacie rekordowym, gdzie każde pole znajduje się w osobnej linii. Pola są również różne w obu formatach, więc należy użyć dwóch różnych trybów odczytu. Naprawiony format szerokości zawiera zawsze "VV" na początku każdej linii. Jak sprawdzić strumień przed czytaniem i zastosować inny tryb czytania w zależności od formatu? – Andrus

+0

Jak IgnoreFirst/IgnoreLast na żądanie zamiast w klasie? – zerohero

+1

engine.Options.IgnoreFirstLines = 1 – zerohero

3

Można użyć zdarzenia BeforeReadRecord aby sprawdzić format linii. Ustaw właściwość SkipThisRecord w danych zdarzenia, jeśli jest to pierwszy rekord. Ustalenie, czy jest to ostatni rekord, stanowi problem, ale można po prostu sprawdzić jego długość lub format. Oczywiście to zapobiegnie przechwytywaniu błędów spowodowanych przez zniekształcone rekordy.

Inną możliwością jest załadowanie całego pliku do pamięci przy użyciu File.ReadAllLines. Usuń pierwsze i ostatnie elementy z wynikowej tablicy, przekształć je z powrotem w ciąg znaków, a następnie wywołaj ReadString. Lub możesz napisać ciągi znaków do numeru MemoryStream i zadzwonić pod numer ReadStream.

+0

błędy 404 po obu linków. – justSteve

+1

@justSteve: Naprawiono uszkodzone linki. Dokumentacja FileHelpers znajduje się pod adresem http://www.filehelpers.net/docs/html/R_Project_FileHelpers.htm –

0

najlepszy jest do dekoracji klasę z [IgnoreFirst] atrybutu.

Jeśli z jakiegoś powodu nie możesz dodać atrybut można zrobić coś takiego

var engine = new FileHelperEngine<T>(); 
engine.BeforeReadRecord += (e, args) => 
{ 
    if (args.LineNumber == 1) 
     args.SkipThisRecord = true; 
}; 
Powiązane problemy