Ho il seguente problema:
- Ho un file di testo e devo leggerlo e dividerlo in righe.
- Potrebbe essere necessario eliminare alcune righe (in base a criteri non risolti).
- Le righe che non vengono rilasciate devono essere analizzate in alcuni record predefiniti.
- I record che non sono validi devono essere eliminati.
- I record duplicati possono esistere e, in tal caso, sono consecutivi. Se esistono duplicati / più record, è necessario conservare solo un elemento.
- I record rimanenti devono essere raggruppati in base al valore contenuto in un campo; tutti i record appartenenti allo stesso gruppo appaiono uno dopo l'altro (ad esempio AAAABBBBCCDEEEFF e così via).
- Le registrazioni di ciascun gruppo devono essere numerate (1, 2, 3, 4, ...). Per ogni gruppo la numerazione inizia da 1.
- I record devono quindi essere salvati da qualche parte / consumati nello stesso ordine in cui sono stati prodotti.
Devo implementarlo in Java o C ++.
La mia prima idea era di definire funzioni / metodi come:
- Un metodo per ottenere tutte le linee dal file.
- Un metodo per filtrare le linee indesiderate.
- Un metodo per analizzare le righe filtrate in record validi.
- Un metodo per rimuovere i record duplicati.
- Un metodo per raggruppare i record e numerarli.
Il problema è che i dati che ho intenzione di leggere possono essere troppo grandi e potrebbero non adattarsi alla memoria principale: quindi non posso semplicemente costruire tutte queste liste e applicare le mie funzioni una dopo l'altra.
D'altra parte, penso di non aver bisogno di inserire tutti i dati nella memoria principale in una sola volta perché una volta che un record è stato consumato tutti i suoi dati sottostanti (fondamentalmente le righe di testo tra il record precedente e il record corrente, e il disco stesso) possono essere eliminati.
Con la poca conoscenza che ho di Haskell ho immediatamente pensato a una sorta di valutazione lazy, in cui invece di applicare funzioni a liste che sono state completamente calcolate, ho flussi di dati diversi che sono costruiti uno sopra l'altro e, in ogni momento, solo la porzione necessaria di ogni flusso si materializza nella memoria principale.
Ma devo implementarlo in Java o C ++. Quindi la mia domanda è quale modello di progettazione o altra tecnica possa permettermi di implementare questa elaborazione lenta di flussi in uno di questi linguaggi.