
今日は「いなざわ植木まつり」最終日だな。変化はないようだという顔をしている柴犬です。
概要
文字セットが 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;
}
ソートまでやってみたかったのですが今日はここまでとします。