Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Teilen Sie große Text-/CSV-Dateien in mehrere Dateien in PL SQL auf

Manchmal kommt es vor, dass Sie eine sehr große Text- oder CSV-Datei verarbeiten müssen, aber zuerst kleinere Dateien aus dieser großen Datei erstellen möchten. Weil das Verarbeiten oder Öffnen dieser großen Datei möglicherweise zu lange dauert. Daher gebe ich unten ein Beispiel zum Aufteilen einer großen Text-/CSV-Datei in mehrere Dateien in PL SQL mithilfe einer gespeicherten Prozedur.

Sie müssen nur zwei Parameter an diese PL SQL-Prozedur übergeben, erstens den Objektnamen des Datenbankverzeichnisses, in dem sich die Textdateien befinden, und zweitens den Namen der Quelldatei (die Datei, die Sie aufteilen möchten).

Wenn kein Oracle-Verzeichnisobjekt für den Speicherort von Textdateien vorhanden ist, können Sie es wie unten gezeigt erstellen:

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

Ändern Sie den obigen Pfad entsprechend dem Speicherort Ihrer Dateien. Erstellen Sie dann die folgende Prozedur, indem Sie ihr Skript ausführen:

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;

Bei diesem Verfahren werden 100 Zeilen für jede Datei aufgeteilt, die Sie nach Bedarf ändern können. Führen Sie nun diese Prozedur wie unten gezeigt durch, indem Sie den Objektnamen des Datenbankverzeichnisses und den Dateinamen übergeben:

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

Sie können Ihren Dateispeicherort (CSV_FILE_DIR) auf mehrere Dateien überprüfen, die mit Nummern wie 1_text_file.csv, 2_text_file.csv usw. beginnen, wie im folgenden Bild gezeigt: