sql >> Database >  >> RDS >> Oracle

Splits een groot tekst-/CSV-bestand in meerdere bestanden in PL SQL

Soms komt het voor dat je een heel groot tekst- of CSV-bestand moet verwerken, maar van dat grote bestand eerst kleinere bestanden wilt maken. Omdat dat grote bestand te veel tijd kan kosten om te verwerken of te openen. Daarom geef ik hieronder een voorbeeld om een ​​groot tekst-/CSV-bestand op te splitsen in meerdere bestanden in PL SQL met behulp van de opgeslagen procedure.

U hoeft alleen maar twee parameters door te geven aan deze PL SQL-procedure, de eerste is de objectnaam van de databasedirectory, waar de tekstbestanden zich bevinden en de tweede is de naam van het bronbestand (het bestand dat u wilt splitsen).

Als Oracle directory-object niet bestaat voor de locatie van tekstbestanden, dan kunt u het maken zoals hieronder getoond:

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';

Wijzig het bovenstaande pad volgens de locatie van uw bestanden. Maak vervolgens de onderstaande procedure door het bijbehorende script uit te voeren:

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;

Deze procedure splitst 100 rijen voor elk bestand, die u naar wens kunt wijzigen. Voer nu deze procedure uit zoals hieronder getoond door de objectnaam van de databasedirectory en de bestandsnaam door te geven:

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

U kunt uw bestandslocatie (CSV_FILE_DIR) controleren voor de meerdere bestanden die beginnen met nummers zoals 1_text_file.csv, 2_text_file.csv enzovoort, zoals weergegeven in onderstaande afbeelding:

  1. Bereken een lopend totaal in MySQL

  2. Top 5 gratis hulpprogramma's voor databaseontwerp

  3. Nieuwe en evoluerende PostgreSQL Enterprise-functies met recente releases

  4. Het BOOLEAN-type gebruiken in de SELECT-instructie