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

わんくま同盟

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

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

ツリー一括表示

PLSQLによるBOM付きUTF-8でのファイル書き出しの方 /悩み多きランナー (18/06/25(Mon) 23:36) #87734
Re[1]: PLSQLによるBOM付きUTF-8でのファイル書き出しの方 /shu (18/06/26(Tue) 08:24) #87735
│└ Re[2]: PLSQLによるBOM付きUTF-8でのファイル書き出しの方 /悩み多きランナー (18/06/27(Wed) 00:53) #87744 解決済み
Re[1]: PLSQLによるBOM付きUTF-8でのファイル書き出しの方 /魔界の仮面弁士 (18/06/26(Tue) 10:22) #87737
  └ Re[2]: PLSQLによるBOM付きUTF-8でのファイル書き出しの方 /悩み多きランナー (18/06/27(Wed) 00:56) #87745 解決済み


親記事 / ▼[ 87735 ] ▼[ 87737 ]
■87734 / 親階層)  PLSQLによるBOM付きUTF-8でのファイル書き出しの方
□投稿者/ 悩み多きランナー (1回)-(2018/06/25(Mon) 23:36:41)

分類:[データベース全般] 

PLSQLでカンマ区切りのCSVデータをUTF-8のBOMありで出力したいのですが、
どうすればできるか、ご存知でしたら教えてください。

以下のように記述するとUTF-8でCSV出力はできるのですが、BOMなしになってしまいます。
BOMありで出力するための、記述をご存知でしたら教えてください。
FL_PACK UTL_FILE.FILE_TYPE; --ファイルパッケージ
FL_PACK := UTL_FILE.FOPEN('ディレクトリパス','test.csv','w',32767);
UTL_FILE.PUT_LINE(FL_PACK,CONVERT('カンマ区切りのレコード変数','AL32UTF8','AL32UTF8'));

出力した後に別の処理でBOMありにする、出力したファイルを手動で開いてBOMありにするのもありですが、出力ファイルが数Gなので、上記出力処理でBOMありにしたいです。
ネットで調べてみたのですが、目ぼしいのが見つかりませんでした。

よろしくお願い致します。
[ □ Tree ] 返信 編集キー/

▲[ 87734 ] / ▼[ 87744 ]
■87735 / 1階層)  Re[1]: PLSQLによるBOM付きUTF-8でのファイル書き出しの方
□投稿者/ shu (1124回)-(2018/06/26(Tue) 08:24:35)
No87734 (悩み多きランナー さん) に返信

UTF-8のBOM 0xEF 0xBB 0xBF
を書き込んだファイルを作っておいて追加でオープンすれば
なんとかならないでしょうか?

[ 親 87734 / □ Tree ] 返信 編集キー/

▲[ 87735 ] / 返信無し
■87744 / 2階層)  Re[2]: PLSQLによるBOM付きUTF-8でのファイル書き出しの方
□投稿者/ 悩み多きランナー (2回)-(2018/06/27(Wed) 00:53:48)
No87735 (shu さん) に返信
> ■No87734 (悩み多きランナー さん) に返信
>
> UTF-8のBOM 0xEF 0xBB 0xBF
> を書き込んだファイルを作っておいて追加でオープンすれば
> なんとかならないでしょうか?
>

shuさん

返信ありがとうございます。
そういうやり方がありましたね。

今後の参考にさせてもらいます。
解決済み
[ 親 87734 / □ Tree ] 返信 編集キー/

▲[ 87734 ] / ▼[ 87745 ]
■87737 / 1階層)  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;

[ 親 87734 / □ Tree ] 返信 編集キー/

▲[ 87737 ] / 返信無し
■87745 / 2階層)  Re[2]: PLSQLによるBOM付きUTF-8でのファイル書き出しの方
□投稿者/ 悩み多きランナー (3回)-(2018/06/27(Wed) 00:56:13)
No87737 (魔界の仮面弁士 さん) に返信
> ■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;


魔界の仮面弁士さん

返信ありがとうございます。
案1のやり方でBOM付きで出力できました!

なかなかネットで探しても、上記のような紹介サイトがなかったので
大変助かりました。ありがとうございます。
解決済み
[ 親 87734 / □ Tree ] 返信 編集キー/


管理者用

- Child Tree -