2012-01-30 16 views
5

Sto cercando di analizzare alcuni dati in un file di testo formato fisso in cui ogni "record" si sviluppa su una serie di linee, come così ...analisi di un file di testo formato fisso su più righe

MAILBOX: 10013  Created: 01/20/09 4:39 pm 
    MSGS: 0   UNPLAYED: 0   URGENT: 0   RECEIPT: 0 
    LCOS: RBC Standard : 20   FCOS: RBC Standard  : 20 
    GCOS: Default GCOS 1 : 1    NCOS: Default   : 1 
    TCOS: Default TCOS 1 : 1    RCOS:     : 1 
BAD LOGS: 0   LAST LOG: NEVER        MINS:  0.0 
    PASSWD: Y   TUTOR: N    DAY: M   NIGHT: M  
    NAME:         CODE: 
    EXTEN: 10013       INDEX: 0 
ATTEN DN:         INDEX: 0   
DISTRIBUTION LISTS WITH CHANGE RIGHTS: 
    all 
DISTRIBUTION LISTS WITH REVIEW RIGHTS: 
    all 

Ho usato il File Helpers prima per i record a riga singola, ed è stato molto utile. Controllo è la documentazione, esso ha una caratteristica MultiRecordEngine, ma questo sta a significare ...

  • una classe per ogni linea ... non è un problema
  • calcolare la dimensione esatta di ogni formato fisso formato del campo ... dolorosa e aperta all'errore
  • logica controlla ogni linea

e un ulteriore ruga ho trovato è stato il fissato è effettivamente non fissato, cioè ci sono diverse righe di formato a seconda del record di destinazione, così alcuni hanno 21 linee, alcuni 22, 23, 24, ecc

ho trovato parsing biblioteca flat file Java, FFP , ma sono un coder .NET, C#, PowerShell

Esistono modi migliori per gestire questo tipo di analisi?

risposta

4

Quello che ti serve è un lexer. Il tuo record è troppo grande per utilizzare un singolo Regex per l'analisi, quindi devi scrivere una regex per ogni riga e una macchina a stati per verificare che le righe seguano nell'ordine corretto.

Oppure puoi usare un lexer/parser generico per generare il codice per te. Wikipedia ha un tempo lungo list. Il parser Gold sembra un buon candidato.

Non vorrei provare a eseguire il lexing/analisi in PowerShell. Preferisco scrivere il codice come C# o F # e utilizzare l'assembly da PowerShell.

Modifica: Ho appena esaminato la libreria FileHelpers. È possibile creare un Multirecord Engine con un tipo .NET che corrisponda a ogni riga nel proprio record sorgente. Tutto ciò che devi fare è analizzare la matrice dei risultati per un ordine valido e creare oggetti.

+0

Grazie per la risposta ... oh !, questo è sempre più complicato di quanto pensassi :-( – SteveC

+0

Yeap, questa era la direzione in cui stavo andando, ma speravo che ci fosse una soluzione più semplice là fuori. – SteveC

Problemi correlati