パッケージ org.opengion.fukurou.fileexec

## クラス LineSplitter

- java.lang.Object
- - org.opengion.fukurou.fileexec.LineSplitter

-     public final class LineSplitter
      extends Object

  LineSplitter は、１行分のデータを順次分割するクラスです。

       ファイルは、『改行』で行分割して、カンマかタブでカラム分割します。

        応答ファイルの解析処理を簡素化するため、以下のルール(禁止事項)を定めます。
            １．ダブルクオートの中に、ダブルクオート、改行、を含まないこと。
                （カンマとスペースは含めることが出来ます。）
            ２．１行の定義は、『改行』とします。
            ３．スペース分割時は、複数スペースの場合でも、１つの区切り文字として扱います。
                （A B    C D → ｢A｣、｢B｣、｢C｣、｢D｣ に分割されます。）
            ４．カンマ分割は、ダブルクオート間のカンマは分解しません。
                混在した場合でも、最初に見つけた方が優先されます。
            ５．カンマ分割時は、複数カンマの場合は、それぞれ空文字列に分割されます。
                カンマ分割後、それぞれの文字列は、前後スペースを削除(trim)します。
                （A, B , ,  C , D → ｢A｣、｢B｣、｢｣、｢C｣、｢D｣ に分割されます。）
            ６．カラム分解後の、ダブルクオートは、削除します。
                （（A, B , ,  "CC C,C" , D → ｢A｣、｢B｣、｢｣、｢CC C,C｣、｢D｣ に分割されます。）

        処理手順
            １．ファイルより、１行づつ（改行コードで分割）読み込みます。
            ２．読み込んだ１行について、先頭が、『#』の行はコメント行としてスキップします。
            ３．先頭から、区切り文字(スペースかカンマかタブ)が見つかるまでを、１カラムとして取得します。
            ４．その間、ダブルクオートが見つかったら、次のダブルクオートまで、取り込みます。
            ５．カラム分割された単語の前後スペースと、前後ダブルクオートを削除します。
                trim()が先で、ダブルクオートの削除は、後から行います。(ダブルクオート内のtrim()は行いません。)
            ６．個々のカラムを配列にして返します。
            ７．これを、ファイルが終了するまで繰り返します。

       並行性
        このクラスは、staticメソッドのみのユーティリティークラスのため、スレッドに対して、安全です。
        また、ﾌｧｲﾙの読み取りに関して、FileChannelのtryLockを行っています。

  変更履歴:
    1.0.0 (2016/04/28) 新規作成
  バージョン
    1.0
  作成者
    Kazuhiko Hasegawa
  導入されたバージョン:
    JDK1.8,

- - ### コンストラクタの概要

    コンストラクタ
    コンストラクタ | 説明
    --- | ---
    `LineSplitter()` | デフォルトコンストラクター ファイル読み取りのCharsetは、UTF-8になります。
    `LineSplitter​(String chStr, String inClms)` | Charsetに対応した文字列を指定して、オブジェクトを作成します。
    `LineSplitter​(Charset chObj, String inClms)` | Charsetを指定して、オブジェクトを作成します。

  - ### メソッドの概要

    すべてのメソッド インスタンス・メソッド concreteメソッド
    修飾子とタイプ | メソッド | 説明
    --- | --- | ---
    `String` | `cmntCut​(String line)` | 先頭文字が、'#' の行を削除した文字列を返します。
    `void` | `forEach​(Path inPath, Consumer<List<String>> action)` | １行づつ処理を行った結果のトークンをConsumerにセットする繰り返しメソッドです。
    `String[]` | `getColumns()` | #NAME が存在すれば、そこから名前配列を返します。
    `List<String>` | `split​(String orgLine)` | １行分の分割したトークンのリストを返します。

    - ### クラスから継承されたメソッド java.lang.Object

      `clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

- - ### コンストラクタの詳細

    - #### LineSplitter

          public LineSplitter()

      デフォルトコンストラクター ファイル読み取りのCharsetは、UTF-8になります。
      関連項目:
        `StandardCharsets.UTF_8`

    - #### LineSplitter

          public LineSplitter​(String chStr,
                              String inClms)

      Charsetに対応した文字列を指定して、オブジェクトを作成します。
      パラメータ:
        `chStr` - ファイルを読み取るときのCharset文字列
        `inClms` - 外部指定カラム文字列(CSV形式)

    - #### LineSplitter

          public LineSplitter​(Charset chObj,
                              String inClms)

      Charsetを指定して、オブジェクトを作成します。
      パラメータ:
        `chObj` - ファイルを読み取るときのCharsetオブジェクト
        `inClms` - 外部指定カラム文字列(CSV形式)

  - ### メソッドの詳細

    - #### getColumns

          public String[] getColumns()

      #NAME が存在すれば、そこから名前配列を返します。 ここでは、オリジナルのカラム列(ゼロ文字列も含む)ではなく、 存在するカラム名だけのカラム列を返します。 外部指定カラムがあれば、そちらを優先します。 無ければ、長さゼロの配列 が返されます。
      戻り値:
        あれば名前配列、無ければ、長さゼロの配列

    - #### forEach

          public void forEach​(Path inPath,
                              Consumer<List<String>> action)

      １行づつ処理を行った結果のトークンをConsumerにセットする繰り返しメソッドです。 １行単位に、Consumer#action が呼ばれます。 セットされるリストは、１行をトークンに分割したリストで、空行の場合は、SKIPします。 また、オリジナルのカラム列がゼロ文字列の場合は、その列データを返しません。 つまり、存在するカラム名だけの値列を返します。 ファイルを順次読み込むため、内部メモリを圧迫しません。
      パラメータ:
        `inPath` - 処理対象のPathオブジェクト
        `action` - 行を区切り文字で分割した文字列のリストを引数に取るConsumerオブジェクト
      例外:
        `RuntimeException` - ファイル読み込み時にエラーが発生した場合
      関連項目:
        `FileUtil.lockForEach(Path,Consumer)`

    - #### split

          public List<String> split​(String orgLine)

      １行分の分割したトークンのリストを返します。 ファイルの読み込みを、単独または、別に行った場合に、１行データとして、処理できます。 このクラスの特徴である、先頭が、『#』の行は、コメントとみなして、削除します。 １行分をtrim()する処理も、行います。 trim()の結果が、空文字列のみの場合は、空のリストオブジェクトを返します。
      パラメータ:
        `orgLine` - １行データ(オリジナル)
      戻り値:
        １行分の分割したトークンのリスト(行末、コメント、trim処理済み)
      変更履歴:
        7.2.1.0 (2020/03/13) カラム列がデータより少ない場合の対応

    - #### cmntCut

          public String cmntCut​(String line)

      先頭文字が、'#' の行を削除した文字列を返します。 このメソッド上で、#NAME があれば、カラム配列を作成します。 カラム配列は、最初の一度のみ、セット可能とします。
      パラメータ:
        `line` - １行分の文字列(not null)
      戻り値:
        コメント削除後の行
      例外:
        `NullPointerException` - 引数lineが、nullの場合。