Grazie per la ricerca!
Sfondo
Mi è stato assegnato il compito di scrivere un programma per normalizzare e importare dati da varie fonti in un database comune.
Per semplicità, diciamo che il programma è per un sistema di librerie pubbliche e che vogliono mantenere un database di tutti i libri attualmente prestati dalle loro varie filiali. Supponiamo inoltre che i rami non siano collegati a una rete o database comune (sciocco, lo so, ma per favore portami con me).
L'attività consiste nell'accettare i dati inviati dai vari responsabili di filiale e quindi automatizzare il processo di normalizzazione di tali dati e di memorizzarli nel database comune.
Formati di dati non elaborati variabili
I dati grezzi possono essere inviati sotto forma di un file MS Excel, un .csv, un file delimitato da tabulazioni, un file di testo semplice, forse anche solo una semplice email, un campo delimitato file, ecc.
Contenuti dati vagamente correlati
Il contenuto dei file di dati non elaborati generalmente contiene questi campi:
- ID libro
- Titolo libro
- Autore
- È selezionato?
- Giorni scaduti
- ISBN
- Data di scadenza
. . .e così via. Il problema è che alcuni dei file di dati inviati avranno questi campi nelle intestazioni di colonna e altri no (quindi sarà necessario dedurre dai dati quale sia il campo).
Inoltre, i nomi dei campi non saranno sempre coerenti. Un ramo di libreria può chiamare il campo booleano per verificare se un libro è stato ritirato "OnLoan", mentre un altro ramo lo chiama "IsCheckedOut".
repository di dati comuni
Tutti questi dati verranno ingeriti in un database comune con dati normalizzati che sono stati ripuliti durante il processo di acquisizione.
Quindi, si spera, abbiamo qualcosa di simile nel DB finale:
- BranchId
- BookID
- Titolo
- CheckedOut
- ISBN
- DueDate
- DaysOverdue
. . .e così via.
Automazione del processo di importazione
Supponiamo che ci siano migliaia di filiali e che ognuna di esse debba rilasciare questo rapporto al quartier generale della biblioteca una volta al mese.
Ovviamente, il mio cliente può assumere un gruppo di persone con accesso ai dati per svolgere questo lavoro (infatti, è così che viene fatto oggi). La richiesta da parte loro, tuttavia, è quella di automatizzare quanto più possibile per ridurre i costi di immissione dei dati.
Quindi ecco il mio piano, per favore suggerire o criticare via:
- Standardizza la procedura di invio dei file. Questa operazione verrà gestita creando una pagina Web con una finestra di dialogo per il caricamento dei file, FATTO!
-
Determina il tipo di file. Userò C # (non che la lingua sia importante) e ha un modo abbastanza semplice per ottenere il tipo di file, ma a volte otterrò semplicemente un
.txt
che risulta essere delimitato da tabulazioni o pipe, quindi ho bisogno di un algoritmo per rilevare questo . Sto pensando di utilizzare un Bayes Classifier o Rete neurale artificiale per questo. - Tentativo di analizzare i dati nella memoria. Ora ho sperato di stabilire se ho un file excel, un separatore di tabulazioni, un csv, ecc. Farò funzionare il file attraverso il parser corretto per farlo entrare memoria, ma ora è necessario determinare se il file ha intestazioni o se posso dedurre cosa dovrebbero essere le intestazioni in base al valore . Per questo spero di usare ancora un sistema di classificazione Bayes e magari di calcolare una distanza di Levenshtein dal valore agli elementi in una matrice di nomi di intestazione noti / standardizzati. Ma per quanto riguarda l'inferenza di intestazione dai dati? Come posso identificare una colonna come contenente le date di scadenza e una come contenente i numeri ISBN?
-
Spigola, pulisci e invia i valori in ogni colonna. Se sono abbastanza fortunato da essere arrivato a questo punto (so quali sono le intestazioni), allora ho bisogno di scorrere i valori in ogni colonna e pulire / normalizzali. Ad esempio, alcune filiali di biblioteche possono inserire un valore ISBN come "ISBN12-345-67-89" mentre un altro ramo inserisce "123456789". Ho bisogno di cogliere questa differenza e normalizzarla. È un caso solo per un semplice sistema esperto o
if. . .then
? C'è un modo migliore? -
Invia dati normalizzati al database. Questo passaggio non è così banale come sembra, perché alcune filiali di biblioteche potrebbero riportare il titolo di un libro come "Algorithms for Dummies" mentre un altro lo segnala come "Algorithms for Dummies, 1st Edition" . Supponiamo per un secondo che non abbia un codice ISBN per legare insieme i due libri (anche se sono uguali), quale metodo potrebbe essere adatto per dedurre che questi libri sono uguali e assegnare loro una chiave primaria comune int la tabella
Books
relativa ?