2015-04-24 5 views
7

Supponiamo mt table nome è Table_1Come recuperare il nome del file da CSV e inserirlo in una delle colonne di una tabella

Struttura del tavolo è qualcosa di simile:

EMP_id, Emp_Name, File_Name_Input_Date (columns) 

Sto caricando Table_1 da un File CSV. Il nome di questo file CSV è daily_01122014.csv

Sto usando il comando Copy per caricare questa tabella:

ex copy Table_1 from '/location/daily_01122014.csv'delimiter ','; 

Sarà caricare la tabella, ma il nome della colonna File_Name_Input_Date verrà lasciato vuoto, e devo difficile scrivilo

Quello che voglio è scrivere uno script di shell che leggerà dinamicamente il nome del file e lo caricherà in column File_Name, ed estrarrà anche la data dal nome del file.

cioè: se il nome del file è daily_01122014.csv, quindi durante il caricamento Table_1 colonna File_Name dovrebbe essere daily_01122014.csv e Input_Date dovrebbe essere 2014-12-01. Dal momento che ho 50-60 file, non posso farlo manualmente.

+2

soluzioni per la vostra richiesta sono stati dati! –

risposta

2

Che cosa si può fare è aggiungere questa stringa al file prima di caricare i dati di Vertica Vedi qui un esempio:

[[email protected] tmp]$ cat file001.csv 
1,Adrian 
[[email protected] tmp]$ ls -1 file*.csv|xargs -I% sed -i 's/$/,%/' % 
[[email protected] tmp]$ cat file001.csv 
1,Adrian,file001.csv 

- dove ho un file chiamato file * .csv e io aggiungi il nome del file alla fine di ogni riga nel file attuale. Puoi farlo a più di un file. Vorrei utilizzare le risorse di sistema operazione di fare questa trasformazione poi cercando di creare un riempitivo utilizzando il comando copia di Vetica

2

Si può semplicemente utilizzare CURRENT_LOAD_SOURCE() all'interno del vostro COPY:

COPY t (c1, c2, c3 AS CURRENT_LOAD_SOURCE()) 
FROM '/home/load_file_1' ON exampledb_node02, '/home/load_file_2' ON exampledb_node03 
DELIMITER ','; 

In alternativa, è possibile utilizzare una shell script:

#!/bin/bash 
for INPUT_FILE in /path/to/file*.dat; do 
vsql -c "copy test_file_name_insert 
(
input_file_name as '$INPUT_FILE', 
id, 
name 
) 
from '/home/test_input_file.txt' 
delimiter '|' ;" 
done 
+0

Sembra che voglia anche analizzare la data. Forse qualcosa come 'TO_DATE (SPLIT_PART (SPLIT_PART (CURRENT_LOAD_SOURCE(), '_', 2), '.', 1), 'DDMMYYYY'))' funzionerebbe. Non è sicuro, fa riferimento a una colonna in una parte della sua domanda e due in seguito. – woot

+0

@woot Penso che tu sia fuori linea, signore. – Kermit

+0

Non è facile essere verdi, vero, @Kermit? – woot

Problemi correlati