Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Tách tệp văn bản / CSV lớn thành nhiều tệp trong PL SQL

Đôi khi xảy ra trường hợp bạn có một tệp văn bản hoặc tệp CSV rất lớn cần xử lý, nhưng trước tiên bạn muốn tạo các tệp nhỏ hơn của tệp lớn đó. Vì tệp lớn đó có thể mất quá nhiều thời gian để xử lý hoặc mở. Vì vậy, tôi đang đưa ra một ví dụ bên dưới để chia tệp văn bản / CSV lớn thành nhiều tệp trong PL SQL bằng cách sử dụng quy trình được lưu trữ.

Bạn chỉ cần chuyển hai tham số cho thủ tục PL SQL này, đầu tiên là tên đối tượng thư mục cơ sở dữ liệu, nơi chứa các tệp văn bản và thứ hai là tên tệp nguồn (tệp mà bạn muốn tách).

Nếu đối tượng thư mục Oracle không tồn tại cho vị trí của tệp văn bản, thì bạn có thể tạo nó như hình dưới đây:

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

Thay đổi đường dẫn trên theo vị trí tệp của bạn. Sau đó, tạo quy trình dưới đây bằng cách thực thi tập lệnh của nó:

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;

Quy trình này chia 100 hàng cho mỗi tệp, bạn có thể sửa đổi theo nhu cầu của mình. Bây giờ thực hiện thủ tục này như được hiển thị bên dưới bằng cách chuyển tên đối tượng thư mục cơ sở dữ liệu và tên tệp:

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

Bạn có thể kiểm tra vị trí tệp của mình (CSV_FILE_DIR) cho nhiều tệp bắt đầu bằng các số như 1_text_file.csv, 2_text_file.csv, v.v., như được hiển thị trong hình ảnh bên dưới:

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm cách nào để định dạng các truy vấn tiên tri của tôi để các cột không bị quấn?

  2. Gặp lỗi khi thực thi gói

  3. Nhận ORA-03115:kiểu dữ liệu mạng không được hỗ trợ hoặc lỗi đại diện khi tìm nạp mảng varchar từ pl / sql ẩn danh

  4. Thủ tục Oracle không trả về kết quả khi thực thi từ tác vụ tập lệnh trên SSIS

  5. 4 cách để chèn nhiều hàng trong Oracle