Sibainu Relax Room

愛犬の柴犬とともに過ごす部屋

JAVAでクイックソート2

今日は「いなざわ植木まつり」最終日だな。変化はないようだという顔をしている柴犬です。

概要

文字セットが Shift-JIS のCSVファイルを正しく読み込むまでを記事にしました。

今日も散々な目にあいましたが、忍耐忍耐と思いやっとの思いでここまで来ました。

読み込みは速く、1秒もかかっていないようです。

今日も、この本にお世話になっています。

CSVを読み込むコード

copy

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 を指定して取得しないといけないのでしょう。

copy

	
public static String sjisToutf8(String value) {
    byte[] b = value.getBytes(StandardCharsets.US_ASCII);
    value = new String(b, StandardCharsets.UTF_8);
    return value;
}

ソートまでやってみたかったのですが今日はここまでとします。