sql >> データベース >  >> RDS >> Oracle

大きなテキスト/CSVファイルをPLSQLで複数のファイルに分割

    処理するテキストまたはCSVファイルが非常に大きい場合がありますが、最初にその大きなファイルの小さいファイルを作成する必要があります。その大きなファイルは、処理または開くのに時間がかかりすぎる可能性があるためです。そこで、ストアドプロシージャを使用してPLSQLで大きなテキスト/CSVファイルを複数のファイルに分割する例を以下に示します。

    このPLSQLプロシージャに2つのパラメータを渡す必要があります。1つはデータベースディレクトリオブジェクト名で、テキストファイルが存在し、2つ目はソースファイル名(分割するファイル)です。

    テキストファイルの場所にOracleディレクトリオブジェクトが存在しない場合は、次のように作成できます。

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

    ファイルの場所に応じて、上記のパスを変更してください。次に、スクリプトを実行して以下の手順を作成します。

    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;

    この手順では、ファイルごとに100行を分割します。これは、必要に応じて変更できます。次に、データベースディレクトリオブジェクト名とファイル名を渡して、次のようにこの手順を実行します。

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

    次の画像に示すように、1_text_file.csv、2_text_file.csvなどの番号で始まる複数のファイルのファイルの場所(CSV_FILE_DIR)を確認できます。

    1. SQLコマンドの種類

    2. Django1.6を使用したトランザクション管理

    3. MySQLのロケールの完全なリスト

    4. MySQL EXP()関数–eをxの累乗に戻す