2017年6月27日火曜日

表計算ソフトウェアでクリックして一発で文字化けせずに開けるファイル形式にするには

文字コードを UTF-18LE Windowsに対応するために先頭にBOMを付ける 拡張子をtsvにする 可能であればtsv(タブ区切り)で出力をする
OSSのunivocity-parsersを利用します https://github.com/uniVocity/univocity-parsers Windows限定にする場合のjavaのサンプルコードを以下に記載します
import com.univocity.parsers.csv.CsvWriter;
import com.univocity.parsers.csv.CsvWriterSettings;

import javax.swing.*;
import java.io.BufferedWriter;
import java.io.File;
import java.io.IOException;
import java.math.BigInteger;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;

public class TestExport {


    private CsvWriter csvpw;

    public void export(){

        try {

            String filename = "test.csv";

            BufferedWriter bw
                    = Files.newBufferedWriter(Paths.get("." + File.separator + filename)
                    , Charset.forName("Shift_JIS")
                    , StandardOpenOption.WRITE, StandardOpenOption.CREATE, StandardOpenOption.APPEND);

            CsvWriterSettings setting = new CsvWriterSettings();
            csvpw = new CsvWriter(bw, setting);
            csvpw.writeHeaders("A","B","C","D","E");
            csvpw.writeRow("TestA","Test,B","TestC","ああ,,,ああ","い,いい,い");


        }catch (IOException e) {
            e.printStackTrace();
        }finally {
            csvpw.close();
        }
    }

    public static void main(String args[]){
        TestExport testExport = new TestExport();
        testExport.export();
    }
}
全てのプラットフォームの表計算ソフトウェアに対応させる場合 BOMは初回のみ書き込む必要があるので、ファイルが既に存在しているかどうかのチェックが必要です
import com.univocity.parsers.csv.CsvWriter;
import com.univocity.parsers.csv.CsvWriterSettings;
import com.univocity.parsers.tsv.TsvWriter;
import com.univocity.parsers.tsv.TsvWriterSettings;

import javax.swing.*;
import java.io.BufferedWriter;
import java.io.File;
import java.io.IOException;
import java.math.BigInteger;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;

public class TestExport2 {


    private TsvWriter tsvWriter;

    
    public void export(){

        try {

            String filename = "test.tsv";

            BufferedWriter bw
                    = Files.newBufferedWriter(Paths.get("." + File.separator + filename)
                    , Charset.forName("UTF-16LE")
                    , StandardOpenOption.WRITE, StandardOpenOption.CREATE, StandardOpenOption.APPEND);

            
            TsvWriterSettings setting = new TsvWriterSettings();
            tsvWriter = new TsvWriter(bw, setting);
            bw.write('\ufeff'); //BOM
            tsvWriter.writeHeaders("A","B","C","D","E");
            tsvWriter.writeRow("TestA","Test,B","TestC","ああ,,,ああ","い,いい,い");


        }catch (IOException e) {
            e.printStackTrace();
        }finally {
            tsvWriter.close();
        }
    }

    public static void main(String args[]){
        TestExport testExport = new TestExport();
        testExport.export();
    }
}

0 件のコメント:

コメントを投稿

speedtest.netのホストを一時中断

10ギガビットの普及に伴い、新たに10ギガビットネットワークの用意ができるまでホストをやめます (PING値でサーバが決定されてしまうので計測ユーザに迷惑なため) [root@localhost ~]# ifconfig enp2s0f0: flags=4163<...