OneSideTrim.java

package com.github.mygreen.supercsv.cellprocessor.conversion;

import org.supercsv.cellprocessor.CellProcessorAdaptor;
import org.supercsv.cellprocessor.ift.CellProcessor;
import org.supercsv.cellprocessor.ift.StringCellProcessor;
import org.supercsv.util.CsvContext;

/**
 * 片方だけトリムするCellProcessor。
 *
 * @since 2.1
 * @author T.TSUCHIE
 *
 */
public class OneSideTrim extends CellProcessorAdaptor implements StringCellProcessor {

    /**
     * トリム対象の文字
     */
    private final char trimChar;

    /**
     * 左側をトリムするかどうか。
     * ・トリム対象の文字がある側を指定します。
     */
    private final boolean leftAlign;

    /**
     * コンストラクタ
     *
     * @param trimChar トリム対象の文字
     * @param leftAlign 左側をトリムするかどうか。
     */
    public OneSideTrim(final char trimChar, final boolean leftAlign) {
        super();
        this.trimChar = trimChar;
        this.leftAlign = leftAlign;
    }

    /**
     * コンストラクタ
     *
     * @param trimChar トリム対象の文字
     * @param leftAlign 左側をトリムするかどうか。
     * @param next チェインの中で呼ばれる次の{@link CellProcessor}.
     */
    public OneSideTrim(final char trimChar, final boolean leftAlign, final StringCellProcessor next) {
        super(next);
        this.trimChar = trimChar;
        this.leftAlign = leftAlign;
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public <T> T execute(final Object value, final CsvContext context) {
        
        if(value == null) {
            return next.execute(value,  context);
        }
        
        final String result = trim(value.toString());
        return next.execute(result, context);
    }

    /**
     * 文字をトリミングする
     * @param str トリミング対象の文字
     * @return トリムした結果
     */
    private String trim(final String str) {

        final int length = str.length();
        if(length == 0) {
            return str;
        }

        if(leftAlign) {
            if(str.charAt(0) != trimChar) {
                // 左端がトリム対象の文字出ない場合、処理終了
                return str;

            }

            // 左側から、trimCharに一致しない位置を探す
            for(int i=0; i < length; i++) {
                char c = str.charAt(i);
                if(c != trimChar) {
                    return str.substring(i);
                }
            }

            // 全ての文字がトリム対象の場合
            return "";

        } else {
            if(str.charAt(length - 1) != trimChar) {
                // 右端がトリム対象の文字出ない場合、処理終了
                return str;

            }

            // 右側から、trimCharに一致しない位置を探す
            for(int i=length - 1; i >= 0; i--) {
                char c = str.charAt(i);
                if(c != trimChar) {
                    return str.substring(0, i + 1);
                }
            }

            // 全ての文字がトリム対象の場合
            return "";

        }

    }

    /**
     * トリム対象の文字を取得する
     * @return トリム対象の文字
     */
    public char getTrimChar() {
        return trimChar;
    }

    /**
     * 左側をトリムするかどうかを取得する。
     * @return 左側をトリムするかどうか
     */
    public boolean isLeftAlign() {
        return leftAlign;
    }



}