C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト


■87737 / )  Re[1]: PLSQLによるBOM付きUTF-8でのファイル書き出しの方
□投稿者/ 魔界の仮面弁士 (1722回)-(2018/06/26(Tue) 10:22:40)
No87734 (悩み多きランナー さん) に返信
> UTL_FILE.PUT_LINE(FL_PACK,CONVERT('カンマ区切りのレコード変数','AL32UTF8','AL32UTF8'));

PUT_LINE で出力できましたっけ?


-- 案1 --
DECLARE
  --ファイルパッケージ
  FL_PACK UTL_FILE.FILE_TYPE;

  -- ZERO WIDTH NO-BREAK SPACE
  ZWNBSP CONSTANT NVARCHAR2(1) := UTL_RAW.CAST_TO_NVARCHAR2(HEXTORAW('FEFF'));
BEGIN
  
  -- Unicode ファイルを出力するのだから、FOPEN ではなく FOPEN_NCHAR を使う
  -- なお、コンテンツは NVARCHAR2 で良いけれど、ファイルパスは VARCHAR2 なので注意
  FL_PACK := UTL_FILE.FOPEN_NCHAR('C:\test', 'test.csv', 'w', 32767);

  -- BOM の代用として ZWNBSP を送出
  -- 当然、PUT ではなく PUT_NCHAR を使う
  UTL_FILE.PUT_NCHAR( FL_PACK, ZWNBSP );

  -- ここからがデータ本体
  -- PUT_LINE ではなく PUT_LINE_NCHAR を使う
  UTL_FILE.PUT_LINE_NCHAR( FL_PACK, N'1,最初の行,first' );
  UTL_FILE.PUT_LINE_NCHAR( FL_PACK, N'2,後続の行,second' );
  UTL_FILE.PUT_LINE_NCHAR( FL_PACK, N'3,最後の行,last' );

  UTL_FILE.FCLOSE( FL_PACK );
END;



-- 案2 --
DECLARE
  FL_PACK UTL_FILE.FILE_TYPE;
  BOM_UTF8      CONSTANT RAW(3) := HEXTORAW('EFBBBF');
  BOM_UTF16__BE CONSTANT RAW(2) := HEXTORAW('FEFF');
  BOM_UTF16__LE CONSTANT RAW(2) := HEXTORAW('FFFE');
  BOM_UTF32__BE CONSTANT RAW(4) := HEXTORAW('0000FEFF');
  BOM_UTF32__LE CONSTANT RAW(4) := HEXTORAW('FFFE0000');

  -- 今回は CR+LF 改行にしてみる
  LINE NVARCHAR2(2) := NCHR(13) || NCHR(10);
  
  DST_CHAR_SET VARCHAR2(64) := 'AL32UTF8';
  SRC_CHAR_SET VARCHAR2(64) := 'AL16UTF16';
BEGIN
  
  -- テキスト出力(w)モードではなく、バイナリ出力モード(wb)にする
  FL_PACK := UTL_FILE.FOPEN('C:\test', 'test.csv', 'wb', 32767);
  
  UTL_FILE.PUT_RAW( FL_PACK, BOM_UTF8 );

  -- バイナリ出力なので、改行も自分で補う必要がある
  UTL_FILE.PUT_RAW( FL_PACK, UTL_I18N.STRING_TO_RAW( N'1,最初の行,first' || LINE, DST_CHAR_SET) );
  UTL_FILE.PUT_RAW( FL_PACK, UTL_I18N.STRING_TO_RAW( N'2,後続の行,second' || LINE, DST_CHAR_SET) );
  UTL_FILE.PUT_RAW( FL_PACK, UTL_I18N.STRING_TO_RAW( N'3,最後の行,last' || LINE, DST_CHAR_SET) );

  UTL_FILE.FCLOSE( FL_PACK );
END;

返信 編集キー/


管理者用

- Child Tree -