読込みと同じ方法で対応できる。
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\"")) + "\""; } }