2010-01-27 10 views
6

EDIT: Sto principalmente analizzando "valori separati da virgola", fuzzy ha portato questo termine alla mia attenzione.Suggerimenti per scrivere un parser di file in Java?

L'interpretazione dei blocchi di CSV è la domanda principale qui.

so come leggere il file in qualcosa di simile a un String[] e alcune delle caratteristiche di base di String, ma non credo che con metodi come e l'analisi di carattere per carattere tutto funzionerà.

Quali sono alcuni modi in cui posso farlo in modo più intelligente?

Esempio di una linea:

-barfoob: boobs, foob, "foo bar"

+3

Il formato è valido XML? – SLaks

+0

Mantenere i bug fuori dal codice. –

+0

No, non sto seguendo nessuno standard o userò XML; complicherebbe inutilmente le cose. – defectivehalt

risposta

6

Dal momento che l'ingresso è "formattato in modo simile a HTML", allora è probabile che i dati siano meglio rappresentati utilizzando una struttura ad albero, e anche , è probabile che sia XML o simile a XML.

In questo caso, propongo il modo più intelligente di analizzare il file utilizzando un parser XML.

Ecco alcune risorse si possono trovare utili:

HTH

+0

I dati non sono XML e se lo fossero sembrerebbero orrendi e non amichevoli. – defectivehalt

0

Potrebbe essere possibile utilizzare lo Neko HTML parser in una certa misura. Dipende da come gestisce l'HTML non standard.

1

A seconda della complessità dello "schema", un'espressione regolare potrebbe essere ciò che si desidera. Se c'è un sacco di nidificazione allora potrebbe essere più semplice convertire in XML o JSON e usare un parser pre-compilato.

0

Se l'XML è valido, personalmente preferisco usare http://www.xom.nu semplicemente perché presenta un bel modello DOM. Come sottolineato, però, ci sono parser in J2SE.

+0

Cosa c'è di sbagliato nell'aggiungere una preferenza per una libreria XML? –

2

Se il documento è XML valido, tutte le altre risposte funzioneranno. Se non lo è, avrai have to lex.

7

C'è una ragione per cui tutti pensano che tu stia parlando di XML: inventare un formato di file proprietario basato su testo richiede giustificazione molto forte di fronte alla maturità e facile disponibilità di parser XML.

E la tua domanda indica che è stato molto poca conoscenza preventiva circa parser (altrimenti si sarebbe scrivendo una grammatica ANTLR o JavaCC invece di chiedere a questa domanda) - che è un altro forte argomento contro posizionare il proprio, se non come apprendimento Esperienza.

+0

Beh, sì, è principalmente un'esperienza di apprendimento. Anche l'aspetto proprietario è molto giustificato. – defectivehalt

2

si dovrebbe guardare ANTLR anche se si desidera scrivere il parser da soli, ANTLR è una grande alternativa.O almeno guardare YAML

1

Le persone hanno ragione sul fatto che i formati standard siano le migliori pratiche, ma mettiamole da parte.

Supponendo che l'esempio fornito sia rappresentativo, l'attività è piuttosto banale.

Si mostra una linea con un token iniziale, demarked con uno spazio dei due punti, quindi un elenco di valori separati da virgola. Separare in quel primo spazio dei due punti e quindi usare split() sulla parte a destra. Anche la gestione delle virgolette è banale.

1

Dopo aver guardato il vostro input di esempio, non riesco a vedere alcuna somiglianza con HTML o XML:

-barfoob: boobs, foob, "foo bar"

Se questo è ciò che si desidera analizzare, ho una proposta alternativa, di utilizzare il Java parser delle proprietà (fornito con Java standard), quindi analizza il resto di ogni riga utilizzando il tuo codice personalizzato. Dovrai rifattorizzare un po 'il tuo formato per farlo funzionare, quindi dipende da te.

barfoob=boobs, foob, "foo bar"

proprietà Java saranno in grado di restituire voi barfoob come il nome della proprietà, e boobs, foob, "foo bar" come il valore della proprietà. È qui che puoi utilizzare il tuo codice personalizzato per dividere il valore della proprietà in boobs, foob e foo bar.

1

Consiglio vivamente di non reinventare la rotella e utilizzare una soluzione esistente come Flatworm, Fixedformat4j o jFFP in grado di analizzare tutti i valori di valori posizionali o separati da virgola (personalmente raccomando Flatworm).