TSVの書き込み

読込みと同じ方法で対応できる。
oboe2uran.hatenablog.com

TSVの書き込みの場合の継承元は、yipuran-csv の Wiki - CSV書き込みを参照

  • CsvCreator と同じ方法の interface TsvCreator
  • CsvwriteArrayStream と同じ方法の interface TsvwriteArrayStream
  • CsvwriteListStreamと同じ方法の interface TsvwriteListStream

いずれも、org.yipuran.csv4j.CSVWriter を使う時に、デリミタ措定を
カンマ区切りから、タブ区切りに変更することと、
1行分作成の Stream の join でタブ文字を指定するように
変更することである。

使い方は、yipuran-csv の Wiki - CSV書き込み と同じである。

TsvCreator

import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Serializable;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;
import java.util.Collection;
import java.util.function.Supplier;
import java.util.stream.Collectors;
import org.yipuran.csv.BOMfunction;
import org.yipuran.csv4j.CSVWriter;
/**
 * TSV作成 interface
 */
@FunctionalInterface
public interface TsvCreator extends Serializable{
    /**
     * TSV出力行数分の Colleactionを返す Supplier を取得する.
     * @return Supplier<Collection<String[]>>
     */
    public Supplier<Collection<String[]>> getSupplier();

    /**
     * TSV出力実行.
     * @param out OutputStream
     * @param charName 文字セット名
     */
    default public void create(OutputStream out, String charName){
        try(OutputStreamWriter writer = new OutputStreamWriter(out, charName)){
            CSVWriter csvWriter = new CSVWriter(writer, '\t');
            for(String[] s:getSupplier().get()){
                for(int i=0;i < s.length;i++){
                    s[i] = s[i]==null ? "" : s[i];
                }
                csvWriter.writeLine(s);
            }
        }catch(Exception e){
            throw new RuntimeException(e.getMessage(), e);
        }
    }
    /**
     * ダブルクォート括りTSV出力実行.
     * @param out OutputStream
     * @param charName 文字セット名
     */
    default public void createWithDblQuot(OutputStream out, String charName){
        String lineSeparator = System.getProperty("line.separator");
        try(OutputStreamWriter writer = new OutputStreamWriter(out, charName)){
            for(String[] sary:getSupplier().get()){
                for(int i=0;i < sary.length;i++){
                    sary[i] = sary[i]==null ? "" : sary[i];
                }
                writer.write(tsvline(sary));
                writer.write(lineSeparator);
            }
        }catch(Exception e){
            throw new RuntimeException(e.getMessage(), e);
        }
    }
    /**
     * BOM付きUTF-8 TSV出力実行
     * @param out OutputStream
     */
    default public void createBomUTF8(OutputStream out){
        try(OutputStreamWriter writer = new OutputStreamWriter(out, StandardCharsets.UTF_8)){
            BOMfunction.push(out);
            CSVWriter csvWriter = new CSVWriter(writer, '\t');
            for(String[] sary:getSupplier().get()){
                for(int i=0;i < sary.length;i++){
                    sary[i] = sary[i]==null ? "" : sary[i];
                }
                csvWriter.writeLine(sary);
            }
        }catch(Exception e){
            throw new RuntimeException(e.getMessage(), e);
        }
    }
    /**
     * BOM付きUTF-8ダブルクォート括り TSV出力実行
     * @param out OutputStream
     */
    default public void createBomUTF8WithDblQuot(OutputStream out){
        String lineSeparator = System.getProperty("line.separator");
        try(OutputStreamWriter writer = new OutputStreamWriter(out, StandardCharsets.UTF_8)){
            BOMfunction.push(out);
            for(String[] sary:getSupplier().get()){
                for(int i=0;i < sary.length;i++){
                    sary[i] = sary[i]==null ? "" : sary[i];
                }
                writer.write(tsvline(sary));
                writer.write(lineSeparator);
            }
        }catch(Exception e){
            throw new RuntimeException(e.getMessage(), e);
        }
    }
    /**
     * ダブルクォート括り1行作成.
     * @param ary 1行生成する配列
     * @return ダブルクォート括り1行
     */
    default public String tsvline(String[] ary){
        return "\"" + Arrays.stream(ary).map(s->s.replaceAll("\"","\"\""))
                   .collect(Collectors.joining("\"\t\"")) + "\"";
    }
}

TsvwriteArrayStream
String[] の Stream を指定する場合の為に

import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;
import java.util.function.Supplier;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import org.yipuran.csv.BOMfunction;
import org.yipuran.csv4j.CSVWriter;
/**
 * 配列 Stream から生成
 */
@FunctionalInterface
public interface TsvwriteArrayStream{
    /**
     * TSV出力行数分の String配列の Stream を返す Supplier を取得する.
     * @return Supplier<Stream<String[]>>
     */
    Supplier<Stream<String[]>> getSupplier();

    /**
     * TSV出力実行.
     * @param out OutputStream
     * @param charName 文字セット名
     */
    default public void create(OutputStream out, String charName){
        try(OutputStreamWriter writer = new OutputStreamWriter(out, charName)){
            CSVWriter csvWriter = new CSVWriter(writer, '\t');
            getSupplier().get().map(s->{
                for(int i=0;i < s.length;i++){
                    s[i] = s[i]==null ? "" : s[i];
                }
                return s;
            }).forEach(t->{
                try{
                    csvWriter.writeLine(t);
                }catch(IOException ex){
                    throw new RuntimeException(ex);
                }
            });
        }catch(Exception ex){
            throw new RuntimeException(ex.getMessage(), ex);
        }
    }
    /**
     * ダブルクォート括りTSV出力実行.
     * @param out OutputStream
     * @param charName 文字セット名
     */
    default public void createWithDblQuot(OutputStream out, String charName){
        String lineSeparator = System.getProperty("line.separator");
        try(OutputStreamWriter writer = new OutputStreamWriter(out, charName)){
            getSupplier().get().map(s->{
                for(int i=0;i < s.length;i++){
                    s[i] = s[i]==null ? "" : s[i];
                }
                return s;
            }).forEach(t->{
                try{
                    writer.write(tsvline(t));
                    writer.write(lineSeparator);
                }catch(IOException ex){
                    throw new RuntimeException(ex);
                }
            });
        }catch(Exception e){
            throw new RuntimeException(e.getMessage(), e);
        }
    }
    /**
     * BOM付きUTF-8 TSV出力実行
     * @param out OutputStream
     */
    default public void createBomUTF8(OutputStream out){
        try(OutputStreamWriter writer = new OutputStreamWriter(out, StandardCharsets.UTF_8)){
            BOMfunction.push(out);
            CSVWriter csvWriter = new CSVWriter(writer, '\t');
            getSupplier().get().map(s->{
                for(int i=0;i < s.length;i++){
                    s[i] = s[i]==null ? "" : s[i];
                }
                return s;
            }).forEach(t->{
                try{
                    csvWriter.writeLine(t);
                }catch(IOException ex){
                    throw new RuntimeException(ex);
                }
            });
        }catch(Exception e){
            throw new RuntimeException(e.getMessage(), e);
        }
    }
    /**
     * BOM付きUTF-8ダブルクォート括り TSV出力実行
     * @param out OutputStream
     */
    default public void createBomUTF8WithDblQuot(OutputStream out){
        String lineSeparator = System.getProperty("line.separator");
        try(OutputStreamWriter writer = new OutputStreamWriter(out, StandardCharsets.UTF_8)){
            BOMfunction.push(out);
            getSupplier().get().map(s->{
                for(int i=0;i < s.length;i++){
                    s[i] = s[i]==null ? "" : s[i];
                }
                return s;
            }).forEach(t->{
                try{
                    writer.write(tsvline(t));
                    writer.write(lineSeparator);
                }catch(IOException ex){
                    throw new RuntimeException(ex);
                }
            });
        }catch(Exception e){
            throw new RuntimeException(e.getMessage(), e);
        }
    }
    /**
     * ダブルクォート括り1行作成.
     * @param ary 1行生成する配列
     * @return ダブルクォート括り1行
     */
    default public String tsvline(String[] ary){
        return "\"" + Arrays.stream(ary).map(s->s.replaceAll("\"","\"\""))
                   .collect(Collectors.joining("\"\t\"")) + "\"";
    }
}

TsvwriteListStream
List<String> の Stream から生成

import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.nio.charset.StandardCharsets;
import java.util.List;
import java.util.function.Supplier;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import org.yipuran.csv.BOMfunction;
import org.yipuran.csv4j.CSVWriter;

/**
 * List<String> の Stream から生成
 */
@FunctionalInterface
public interface TsvwriteListStream{

    Supplier<Stream<List<String>>> getSupplier();

    /**
     * TSV出力実行.
     * @param out OutputStream
     * @param charName 文字セット名
     */
    default public void create(OutputStream out, String charName){
        try(OutputStreamWriter writer = new OutputStreamWriter(out, charName)){
            CSVWriter csvWriter = new CSVWriter(writer, '\t');
            getSupplier().get().map(list->list.stream().map(s->s==null ? "" : s)
            .collect(Collectors.toList()))
            .forEach(t->{
                try{
                    csvWriter.writeLine(t);
                }catch(IOException ex){
                    throw new RuntimeException(ex);
                }
            });
        }catch(Exception ex){
            throw new RuntimeException(ex.getMessage(), ex);
        }
    }
    /**
     * ダブルクォート括りTSV出力実行.
     * @param out OutputStream
     * @param charName 文字セット名
     */
    default public void createWithDblQuot(OutputStream out, String charName){
        String lineSeparator = System.getProperty("line.separator");
        try(OutputStreamWriter writer = new OutputStreamWriter(out, charName)){
            getSupplier().get().map(list->list.stream().map(s->s==null ? "" : s)
            .collect(Collectors.toList()))
            .forEach(t->{
                try{
                    writer.write(tsvline(t));
                    writer.write(lineSeparator);
                }catch(IOException ex){
                    throw new RuntimeException(ex);
                }
            });
        }catch(Exception e){
            throw new RuntimeException(e.getMessage(), e);
        }
    }
    /**
     * BOM付きUTF-8 TSV出力実行
     * @param out OutputStream
     */
    default public void createBomUTF8(OutputStream out){
        try(OutputStreamWriter writer = new OutputStreamWriter(out, StandardCharsets.UTF_8)){
            BOMfunction.push(out);
            CSVWriter csvWriter = new CSVWriter(writer, '\t');
            getSupplier().get().map(list->list.stream().map(s->s==null ? "" : s)
            .collect(Collectors.toList()))
            .forEach(t->{
                try{
                    csvWriter.writeLine(t);
                }catch(IOException ex){
                    throw new RuntimeException(ex);
                }
            });
        }catch(Exception e){
            throw new RuntimeException(e.getMessage(), e);
        }
    }
    /**
     * BOM付きUTF-8ダブルクォート括り TSV出力実行
     * @param out OutputStream
     */
    default public void createBomUTF8WithDblQuot(OutputStream out){
        String lineSeparator = System.getProperty("line.separator");
        try(OutputStreamWriter writer = new OutputStreamWriter(out, StandardCharsets.UTF_8)){
            BOMfunction.push(out);
            getSupplier().get().map(list->list.stream().map(s->s==null ? "" : s)
            .collect(Collectors.toList()))
            .forEach(t->{
                try{
                    writer.write(tsvline(t));
                    writer.write(lineSeparator);
                }catch(IOException ex){
                    throw new RuntimeException(ex);
                }
            });
        }catch(Exception e){
            throw new RuntimeException(e.getMessage(), e);
        }
    }
    /**
     * Collection→ダブルクォート括り1行作成.
     * @param list 1行生成する文字列 List
     * @return ダブルクォート括り1行
     */
    default public String tsvline(List<String> list){
        return "\"" + list.stream().map(s->s.replaceAll("\"","\"\""))
                   .collect(Collectors.joining("\"\t\"")) + "\"";
    }
}