Domanda

Sto cercando di analizzare un tavolo sotto forma di un file di testo utilizzando ifstream, e la valutazione / manipolazione di ogni voce. Tuttavia, sto avendo problemi a capire come affrontare questo a causa di omissioni di elementi particolari. Si consideri la seguente tabella:

NEW  VER  ID   NAME
1    2a   4    "ITEM ONE" (2001)
     1    7    "2 ITEM" (2002) {OCT}
     1.1  10   "SOME ITEM 3" (2003)
1         12   "DIFFERENT ITEM 4" (2004)
1    a4   16   "ITEM5" (2005) {DEC}

Come si può vedere, a volte la colonna "NUOVO" non ha nulla in esso. Quello che voglio fare è prendere atto della ID, il nome, l'anno (tra parentesi), e la nota se ci sono parentesi graffe o non dopo.

Quando ho iniziato a fare questo, ho guardato per una funzione "split", ma mi sono reso conto che sarebbe stato un po 'più complicato a causa delle voci mancanti di cui sopra ei titoli si stacchi.

L'unica cosa che mi viene in mente è la lettura ogni parola per parola la linea, tenendo traccia del l'ultimo numero che ho visto. Una volta mi ha colpito un segno di virgolette, prendere nota che l'ultimo numero che ho visto era un ID (se ho usato qualcosa di simile a una scissione, il diritto posizione di matrice prima che le virgolette), quindi tenere traccia di tutto ciò che fino a quando la citazione successiva (il titolo) , poi finalmente, iniziare la ricerca di parentesi quadre e graffe per le altre informazioni. Tuttavia, questo sembra davvero primitiva e sto cercando un modo migliore per farlo.

Lo sto facendo per affinare le mie capacità C ++ e il lavoro con i più grandi, set di dati già esistenti, quindi mi piacerebbe usare C ++, se possibile, ma se un altro linguaggio (sto guardando Perl o Python) rende questo banalmente facile , ho potuto solo imparare come interfacciare un linguaggio diverso con C ++. Quello che sto cercando di fare ora è solo vagliando i dati in ogni modo che alla fine diventano oggetti in C ++, quindi ho ancora possibilità di migliorare le mie capacità C ++.

EDIT:. Mi rendo anche conto che questo è possibile portare a termine utilizzando solo regex, ma mi piacerebbe provare a utilizzare diversi metodi di manipolazione dei file / string, se possibile,

È stato utile?

Soluzione

Se gli offset di colonna sono veramente fisso (nessuna schede, solo i veri caratteri di spazio a la 0x20) avrei letto una riga alla volta (string::getline) e scomposizione utilizzando gli offset fissi in una serie di quattro corde (string::substr).

Poi PostProcess ogni 4 parametri di stringhe, come richiesto.

Non vorrei hard-code gli offset, conservarli in un file di input separato che descrive il formato dell'ingresso -. Come una descrizione tabella in SQL Server o un altro DB

Altri suggerimenti

Qualcosa di simile a questo:

  1. Leggi la prima linea, trovare "ID", e memorizzare l'indice.
  2. Leggi ogni linea di dati utilizzando std::getline().
  3. Crea una stringa da una linea dati, a partire dall'indice hai trovato "ID" nella riga di intestazione. Usare questo per inizializzare un std::istringstream con.
  4. Leggi l'ID utilizzando iss >> an_int.
  5. Cerca il primo ". Cerca nel secondo ". Cerca nel ( e ricordare il suo indice. Cerca nel ) e ricordare che indice, anche. Creare una sottostringa dai personaggi tra tali indici e usarlo per inizializzare un'altra std::istringstream con. Leggere il numero da questo flusso.
  6. Cerca le parentesi graffe.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top