Oracle
 sql >> Database >  >> RDS >> Oracle

Dividi file di testo/CSV di grandi dimensioni in più file in PL SQL

A volte capita di dover elaborare un file di testo o CSV molto grande, ma prima si desidera creare file più piccoli di quel file di grandi dimensioni. Perché un file di grandi dimensioni potrebbe richiedere troppo tempo per l'elaborazione o l'apertura. Quindi sto fornendo un esempio di seguito per dividere file di testo/CSV di grandi dimensioni in più file in PL SQL utilizzando la procedura memorizzata.

Devi solo passare due parametri a questa procedura PL SQL, il primo è il nome dell'oggetto della directory del database, dove risiedono i file di testo e il secondo è il nome del file di origine (il file che vuoi dividere).

Se l'oggetto directory Oracle non esiste per la posizione dei file di testo, puoi crearlo come mostrato di seguito:

For windows:
CREATE OR REPLACE DIRECTORY CSV_FILE_DIR AS 'D:\plsql\text_files';
For Linux/Unix (due to difference in path):
CREATE OR REPLACE DIRECTORY CSV_FILE_DIR AS '/plsql/text_files';

Cambia il percorso sopra in base alla posizione dei tuoi file. Quindi crea la procedura seguente eseguendo il suo script:

CREATE OR REPLACE PROCEDURE split_file (p_db_dir IN VARCHAR2,
 p_file_name IN VARCHAR2)
IS
 read_file UTL_FILE.file_type;
 write_file UTL_FILE.file_type;
 v_string VARCHAR2 (32767);
 j NUMBER := 1;
BEGIN
 read_file := UTL_FILE.fopen (p_db_dir, p_file_name, 'r');

WHILE j > 0
 LOOP
 write_file := UTL_FILE.fopen (p_db_dir, j || '_' || p_file_name, 'w');

FOR i IN 1 .. 100
 LOOP -- example to dividing into 100 rows for each file.. you can increase the number as per your requirement
 UTL_FILE.get_line (read_file, v_string);
 UTL_FILE.put_line (write_file, v_string);
 END LOOP;

UTL_FILE.fclose (write_file);
 j := J + 1;
 END LOOP;
EXCEPTION
 WHEN OTHERS
 THEN
 -- this will handle if reading source file contents finish
 UTL_FILE.fclose (read_file);
 UTL_FILE.fclose (write_file);
END;

Questa procedura divide 100 righe per ogni file, che puoi modificare secondo le tue esigenze. Ora esegui questa procedura come mostrato di seguito passando il nome dell'oggetto della directory del database e il nome del file:

BEGIN
 split_file ('CSV_FILE_DIR', 'text_file.csv');
END;

Puoi controllare la posizione del tuo file (CSV_FILE_DIR) per i file multipli che iniziano con numeri come 1_text_file.csv, 2_text_file.csv e così via, come mostrato nell'immagine seguente: