001/* 002 * Copyright (c) 2009 The openGion Project. 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.apache.org/licenses/LICENSE-2.0 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, 013 * either express or implied. See the License for the specific language 014 * governing permissions and limitations under the License. 015 */ 016package org.opengion.plugin.io; 017 018import java.io.PrintWriter; 019 020import org.opengion.fukurou.util.StringUtil; 021import org.opengion.hayabusa.db.DBTableModel; 022 023/** 024 * CSV形式ダブルクォートゼロカンマファイル(CSV)形式書き込みクラスです。 025 * 026 * DefaultTableWriter を継承していますので、ラベル、名前、データの出力部のみ 027 * オーバーライドして、可変長CSV形式ファイルの出力機能を実現しています。 028 * 029 * [writeData] 030 * 区切り : CSV_SEPARATOR 固定 031 * 行番号 : quotation( 行番号 + 1 ) 032 * カラムデータ: 数字型でない場合の先頭が 0 の時は、『'』を追加して、quotation 033 * : それ以外は、quotation( val ) 034 * 035 * @og.rev 8.5.6.1 (2024/03/29) 継承で使えるように、一部修正します。 036 * @og.group ファイル出力 037 * 038 * @version 8.5 039 * @author Kazuhiko Hasegawa 040 * @since JDK21.0, 041 */ 042public class TableWriter_CSV extends TableWriter_Default { 043 /** このプログラムのVERSION文字列を設定します。 {@value} */ 044 private static final String VERSION = "8.5.6.1 (2024/03/29)" ; 045 046 /** 047 * デフォルトコンストラクター 048 * 049 * @og.rev 6.4.2.0 (2016/01/29) PMD refactoring. Each class should declare at least one constructor. 050 */ 051 public TableWriter_CSV() { super(); } 052 053 /** 054 * DBTableModel から データを作成して、PrintWriter に書き出します。 055 * 056 * @og.rev 3.1.1.0 (2003/03/28) 同期メソッド(synchronized付き)を非同期に変更する。 057 * @og.rev 3.5.4.3 (2004/01/05) 引数に PrintWriter を受け取るように変更します。 058 * @og.rev 8.5.6.1 (2024/03/29) setSeparator をcsvInit()で行います。 059 * 060 * @param writer PrintWriterオブジェクト 061 */ 062 @Override 063 public void writeDBTable( final PrintWriter writer ) { 064 csvInit(); 065 super.writeDBTable( writer ); 066 } 067 068 /** 069 * PrintWriter に DBTableModelのテーブル情報を書き込みます。 070 * このクラスでは、データを ダブルコーテーション(")で囲みます。 071 * PrintWriter に DBTableModelのテーブル情報を書き込みます。 072 * 073 * @og.rev 2.0.0.1 (2002/09/20) 先頭が0 でかつ数字タイプ(S9)でない場合に ' を出力するように修正 074 * @og.rev 2.0.0.5 (2002/09/30) 先頭が0 でかつ数字タイプ(S9 or R)でない場合に ' を出力するように修正。 075 * @og.rev 2.3.1.2 (2003/01/28) データ出力時に、改行が余分に出される箇所を修正。 076 * @og.rev 3.1.0.0 (2003/03/20) DBColumn から、getDbType() キーを直接取り出す 077 * @og.rev 3.1.1.0 (2003/03/28) 同期メソッド(synchronized付き)を非同期に変更する。 078 * @og.rev 3.7.0.2 (2005/02/14) 行番号情報を、出力する(true)/しない(false)を指定 079 * @og.rev 3.8.0.1 (2005/06/17) DBTypeが NVAR の場合は、元のUnicodeに戻します。 080 * @og.rev 5.1.6.0 (2010/05/01) DbType の初期値(dbType)を利用する。 081 * @og.rev 5.2.1.0 (2010/10/01) useRenderer 対応 082 * @og.rev 5.6.9.4 (2013/10/31) 数字型でない場合の先頭が 0 の時 083 * @og.rev 6.0.1.2 (2014/08/08) カラム飛ばしできる機能を追加 084 * @og.rev 6.0.4.0 (2014/11/28) データ出力用のレンデラー 085 * @og.rev 8.5.2.0 (2023/07/14) 一部の機能廃止による修正(問合・トラブル 0200010980) 086 * @og.rev 8.5.6.1 (2024/03/29) 継承で使えるように、一部修正します。 087 * 088 * @param table DBTableModelオブジェクト 089 * @param writer PrintWriterオブジェクト 090 */ 091 @Override 092 protected void writeData( final DBTableModel table,final PrintWriter writer ) { 093 final int numberOfRows = table.getRowCount(); 094 final boolean useNumber = isUseNumber(); 095 final boolean useRenderer = isUseRenderer(); // 5.2.1.0 (2010/10/01) 096 final String separator = getSeparator(); 097 098 for( int row=0; row<numberOfRows; row++ ) { 099 if( useNumber ) { 100 writer.print( numberQuotation( row+1 ) ); // 8.5.6.1 (2024/03/29) 101 writer.print( separator ); 102 } 103 104 for( int i=0; i<numberOfColumns; i++ ) { 105 if( i != 0 ) { writer.print( separator ); } 106 final int clm = clmNo[i]; 107 if( clm < 0 ) { continue; } // 6.0.1.2 (2014/08/08) カラム飛ばし 108 109 String val = table.getValue(row,clm); 110 // 5.2.1.0 (2010/10/01) useRenderer 対応 111 if( useRenderer ) { 112 // 6.0.4.0 (2014/11/28) データ出力用のレンデラー 113 val = dbColumn[clm].getWriteValue( val ); 114 } 115 116 // 8.5.6.1 (2024/03/29) 継承で使えるように、一部修正します。 117 writer.print( dataQuotation( val,dbType[i] ) ); 118 } 119 writer.println(); 120 } 121 } 122 123 /** 124 * writeDBTable を実行する前の初期設定を行います。 125 * 126 * サブクラスによって処理方法が異なります。 127 * ここでは、separator に、CSV_SEPARATOR を登録しています。 128 * 129 * @og.rev 8.5.6.1 (2024/03/29) 継承で使えるように、一部修正します。 130 */ 131 protected void csvInit() { 132 setSeparator( CSV_SEPARATOR ) ; // 3.5.6.0 (2004/06/18) 133 } 134 135 /** 136 * 先頭の行番号に対してのクオーテーション処理を行います。 137 * 138 * サブクラスによって処理方法が異なります。 139 * 140 * @og.rev 8.5.6.1 (2024/03/29) 継承で使えるように、一部修正します。 141 * 142 * @param row 行番号 143 * 144 * @return 変換後の文字列 145 */ 146 protected String numberQuotation( final int row ) { 147 return quotation( String.valueOf( row+1 ) ) ; 148 } 149 150 /** 151 * データを書き込む場合の区切り文字をセットします。 152 * このクラスでは、CSV 固定の為、区切り文字のセットは無効になります。 153 * 154 * @og.rev 8.5.6.1 (2024/03/29) 継承で使えるように、一部修正します。 155 * 156 * @param val 入力文字列 157 * @param dtype DBタイプ(STRING/NUMBER) 158 * 159 * @return 変換後の文字列 160 */ 161 protected String dataQuotation( final String val, final int dtype ) { 162 // 開始日などの 00000000 を文字列タイプで渡す 163 // 5.6.9.4 (2013/10/31) 数字型でない場合の先頭が 0 の時(dbType[i] != NUMBER) 追加 164 if( StringUtil.startsChar( val , '0' ) && dtype != NUMBER ) { // 6.2.0.0 (2015/02/27) 1文字 String.startsWith 165 return quotation( "'" + val ); 166 } 167 else { 168 return quotation( val ); 169 } 170 } 171 172// /** 173// * データを書き込む場合の区切り文字をセットします。 174// * このクラスでは、CSV 固定の為、区切り文字のセットは無効になります。 175// * 176// * @og.rev 3.1.1.0 (2003/03/28) 同期メソッド(synchronized付き)を非同期に変更する。 177// * @og.rev 8.5.6.1 (2024/03/29) setSeparator をcsvInit()で行います。 178// * 179// * @param sprt 区切り文字 180// */ 181// @Override 182// public void setSeparator( final String sprt ) { 183// super.setSeparator( CSV_SEPARATOR ) ; // 3.5.6.0 (2004/06/18) 184// } 185}