Sto sviluppando un'applicazione in Java per analizzare e caricare record da un CSV a un database online, tramite un'API REST.
Pur essendo sicuro che non ci siano record duplicati in ogni file CSV, non posso essere sicuro che ogni file CSV sia stato elaborato una sola volta (* vedi chiarimenti sotto), quindi ho bisogno di verificare la presenza di duplicati prima di inserire.
[CHIARIMENTO] Non riesco a implementare una soluzione controllando che ogni file CSV sia stato elaborato una sola volta. I file CSV contengono record di transazioni bancarie scaricati da una banca. Pertanto, so che ogni singolo file CSV non contiene duplicati. Tuttavia, è possibile scaricare più file CSV per lo stesso intervallo di date, o per intervalli di date sovrapposti, ecc., Quindi è necessario verificare la presenza di duplicati a livello di transazione anziché a livello di file.
Purtroppo non ho alcun controllo sul database di back-end e posso utilizzare solo i metodi disponibili tramite l'API. Ciò significa le solite soluzioni che utilizzano SQL (ad esempio questa domanda ) non sono adatti.
Metodi disponibili da API ( link ):
-
listTransactions
-
editTransaction
-
insertTransaction
Metodi disponibili ma probabilmente non pertinenti:
-
listProjects
-
listWriteProjects
-
getBalance
-
getTags
-
NewProject
-
deleteProject
-
listTagTransactions
-
deleteTransaction
-
listCurrencies
-
userData
Non è un enorme database: solo quattro colonne e qualche migliaio di record.
Sembra che la mia unica opzione sia quella di iterare su ogni record da inserire e confrontarlo con ogni record del database:
get ListOfRecordsInDb from database using listRecords(). Store in HashMap,
local database or similar data structure??
for each record to be inserted,
iterate over ListOfRecordsInDb, checking none of them match
the record to be inserted
if no match found, insert record
Questo sembra molto inefficiente. Ci sono altre opzioni? In caso contrario, qual è il modo più efficiente per confrontare migliaia di record, utilizzando Java?
Risposte a commenti / domande:
What happens if you call insertTransaction with a transaction that already exists? Does it duplicate it or does it fail?
La transazione è stata inserita correttamente come duplicato
Does the CSV file have an "id" column?
No. Le colonne disponibili sono Data, Descrizione, Quantità e Saldo. La combinazione di questi rende ogni record unico, quindi potrei potenzialmente creare un ID basato su questi.
Does listRecords() allow pagination, or can it only return all of the records?
Restituisce solo i record, in formato XML.