今日は「いなざわ植木まつり」最終日だな。変化はないようだという顔をしている柴犬です。
概要
文字セットが Shift-JIS のCSVファイルを正しく読み込むまでを記事にしました。
今日も散々な目にあいましたが、忍耐忍耐と思いやっとの思いでここまで来ました。
読み込みは速く、1秒もかかっていないようです。
今日も、この本にお世話になっています。
CSVを読み込むコード
import java.awt.FileDialog; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.BufferedReader; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; public class test extends JFrame implements ActionListener { FileDialog fd; JLabel lb; public static void main(String[] args) { new test(); } public test() { setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(600 , 240); setLayout(new GridLayout(3,1)); JButton load = new JButton("LOAD"); load.addActionListener(this); getContentPane().add(load); JButton save = new JButton("SAVE"); save.addActionListener(this); getContentPane().add(save); lb = new JLabel(); getContentPane().add(lb); setVisible(true); } public void actionPerformed(ActionEvent e) { String fullpath; //クリックしたボタンにより処理を分ける if (e.getActionCommand() == "LOAD" ) { fd = new FileDialog(this , "ファイルを開く" , FileDialog.LOAD); } else { fd = new FileDialog(this , "ファイルの保存" , FileDialog.SAVE); } //ファイルダイヤログの表示 fd.setVisible(true); // キャンセルすると null が吐き出されのでその対応 if (fd.getDirectory() != null) { fullpath =fd.getDirectory() + fd.getFile(); lb.setText(fullpath); readcsv(fullpath); } else { lb.setText(""); } } public void readcsv(String fullpath) { try { FileInputStream fis = new FileInputStream(fullpath); // ここで "SJIS" を忘れて大変なことになりました。 InputStreamReader isr = new InputStreamReader(fis, "SJIS"); BufferedReader br = new BufferedReader(isr); String rl; int cr = 0; // これで上手くいくかどうか分かりませんが、ArrayList でやってみます。 ArrayList<String[]> rlf = new ArrayList<String[]>(); while ((rl = br.readLine()) != null) { rlf.add(rl.split(",")); cr += 1; } br.close(); isr.close(); fis.close(); // 読み込んだ CSVファイルの1行目をラベルに表示します。 lb.setText(rlf.get(0)[0] + " : " + rlf.get(0)[1]); } catch(IOException e) { lb.setText(e.toString()); } } }
CSVの読み込み
上記のコードで読み込んだ場合。
文字「住所」もきちんと表示され上手くいきました。
読み込む CSV ファイルです。文字セットは Shift-JIS にしました。
InputStreamReaderの SJIS を忘れた場合
読み込んだ結果は次のとおりです。
文字「住所」が正しく表示できません。
この後、変換関数を rlf.get(0)[1] に適用させるなど試行錯誤しましたがだめでした。やはり元で SJIS を指定して取得しないといけないのでしょう。
public static String sjisToutf8(String value) { byte[] b = value.getBytes(StandardCharsets.US_ASCII); value = new String(b, StandardCharsets.UTF_8); return value; }
ソートまでやってみたかったのですが今日はここまでとします。