Esiste un mono (Net) equivalente allo scanner di classe in Java
-
18-09-2019 - |
Domanda
In Java c'è una bella classe chiamata scanner per la lettura di stringhe e flussi di un determinato formato a-strutture di dati come numeri interi, galleggianti, ... C'è un equivalente in Mono? In Net v'è un binario-reader, ma si legge i dati come file binari. Voglio una classe che leggere i dati analizzando da una stringa.
EDIT: la reazione sulle risposte attuali, so che la maggior parte dei tipi di dati hanno un parse-metodo, ma il problema con questi sono, essi non leggere la stringa in modo sequenziale. In Java è sufficiente inizializzare l'oggetto, e attivando i metodi, di leggere in sequenza i tipi di dati.
Soluzione
Bene, dal momento che si sta leggendo un file in per casi di test, ho intenzione di assumere si conosce l'esatto formato dei dati in arrivo e come ha bisogno di essere analizzato. Guardando classe Parser
di Java nella documentazione non farlo sembrare molto complicato o molto di più di una classe di convenienza. Sembra tokenize solo la stringa flusso sugli spazi e fornire funzioni per prendere il token e analizzarlo. E per quanto ne so, Net non ha una classe equivalente. Quindi, se volete uno per il riutilizzo, allora avrete bisogno di scrivere uno voi stessi.
Ma l'algoritmo di base è necessario è quello di leggere il contenuto del file, dividere i gettoni, e analizzare. Se il file è di dimensioni ragionevoli, è possibile utilizzare File.ReadAllLines()
che legge il contenuto del file linea per linea in un String[]
. Oppure si potrebbe utilizzare una classe StreamReader
di leggere le linee uno alla volta utilizzando la sua ReadLine()
. Poi una volta che li hai in fila, li si dovrebbe tokenize con String
di Split()
, e poi analizzare.
Non sapendo esattamente come è necessario utilizzare i valori nel file, un modello molto semplice potrebbe essere:
// Read in the whole file
String[] strLines = File.ReadAllLines(strFilePath);
// Loop through each of the lines to process their contents
foreach (String strLine in strLines) {
// Tokenize on the spaces
String[] strTokens = strLine.Split(' ');
// Parse the values
int iIntValue = Int.Parse(strTokens[0]);
double dDoubleValue = Double.Parse(strTokens[1]);
// Do something with the values
}
Creare la propria classe Parser
permetterebbe di mantenere i gettoni statali e Advance Auto come li si usa. Se seguire questa strada, il StreamReader
può essere l'opzione migliore.
Altri suggerimenti
La maggior parte dei tipi di dati di base avrà un .Parse
e .TryParse()
metodi che lo farà per voi.
Ad esempio il Int32.TryParse metodo.
In NET, molti del tipo hanno .Parse()
statico e metodi .TryParse()
che accetta un parametro stringa.
Si potrebbe fare qualcosa di simile:
Stream s = new Stream();
// Wire up the stream.
StreamReader reader = new StreamReader(s);
String value = reader.ReadToEnd();
int valueAsInt = Int32.TryParse(value);