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:
-
Holen Sie sich die aktuelle Ortszeit eines beliebigen Landes in PL/SQL
-
Warum kann ich Oracle 11g anscheinend nicht zwingen, mehr CPUs für eine einzelne SQL-Abfrage zu verbrauchen
-
Bevorzugte MySQL-Engine – MyISAM oder InnoDB
-
So sichern oder erstellen Sie eine neue Tabelle aus einer vorhandenen SQL Server-Tabelle in SQL Server - SQL Server / TSQL-Tutorial Teil 105