クラス LineSplitter


  • public final class LineSplitter
    extends Object
    LineSplitter は、1行分のデータを順次分割するクラスです。
     ファイルは、『改行』で行分割して、カンマかタブでカラム分割します。
    
      応答ファイルの解析処理を簡素化するため、以下のルール(禁止事項)を定めます。
          1.ダブルクオートの中に、ダブルクオート、改行、を含まないこと。
              (カンマとスペースは含めることが出来ます。)
          2.1行の定義は、『改行』とします。
          3.スペース分割時は、複数スペースの場合でも、1つの区切り文字として扱います。
              (A B    C D → 「A」、「B」、「C」、「D」 に分割されます。)
          4.カンマ分割は、ダブルクオート間のカンマは分解しません。
              混在した場合でも、最初に見つけた方が優先されます。
          5.カンマ分割時は、複数カンマの場合は、それぞれ空文字列に分割されます。
              カンマ分割後、それぞれの文字列は、前後スペースを削除(trim)します。
              (A, B , ,  C , D → 「A」、「B」、「」、「C」、「D」 に分割されます。)
          6.カラム分解後の、ダブルクオートは、削除します。
              ((A, B , ,  "CC C,C" , D → 「A」、「B」、「」、「CC C,C」、「D」 に分割されます。)
    
      処理手順
          1.ファイルより、1行づつ(改行コードで分割)読み込みます。
          2.読み込んだ1行について、先頭が、『#』の行はコメント行としてスキップします。
          3.先頭から、区切り文字(スペースかカンマかタブ)が見つかるまでを、1カラムとして取得します。
          4.その間、ダブルクオートが見つかったら、次のダブルクオートまで、取り込みます。
          5.カラム分割された単語の前後スペースと、前後ダブルクオートを削除します。
              trim()が先で、ダブルクオートの削除は、後から行います。(ダブルクオート内のtrim()は行いません。)
          6.個々のカラムを配列にして返します。
          7.これを、ファイルが終了するまで繰り返します。
    
     並行性
      このクラスは、staticメソッドのみのユーティリティークラスのため、スレッドに対して、安全です。
      また、ファイルの読み取りに関して、FileChannelのtryLockを行っています。
    
    変更履歴:
    1.0.0 (2016/04/28) 新規作成
    バージョン
    1.0
    作成者
    Kazuhiko Hasegawa
    導入されたバージョン:
    JDK1.8,
    • コンストラクタの詳細

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

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

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