前回はSuperCSVでcsvファイルを読むというプログラムを書きました。

今回はそれをモジュール化してさらにテストしてみます。


-----------------------------------------------------------------------

CSVReader.java


import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.supercsv.io.CsvListReader;
import org.supercsv.io.ICsvListReader;
import org.supercsv.prefs.CsvPreference;


public class CSVReader {


public List<List<String>> csvFileReader(String filePath) throws IOException{

ICsvListReader reader = new CsvListReader(new FileReader(filePath), CsvPreference.EXCEL_PREFERENCE);
List<List<String>> list = new ArrayList<List<String>>();
List<String> temp = null;


while ((temp = reader.read()) != null){
list.add(new ArrayList<String>(temp));
}

return list;
}
}


-----------------------------------------------------------------------

CSVファイルの行数だけListにaddしてListオブジェクトに返すというプログラムです。

引数にはcsvファイルのパスが入ります。



CSVReader.java を右クリックしてJUnitを選択します



みみたれうさぎの実用Javaプログラムの考察


JUnit4を選択して、先ほど書いたプログラムを指定して終了をクリックします


テストクラスができたら以下のように編集します。

-----------------------------------------------------------------------


import static org.junit.Assert.*;

import java.io.IOException;
import java.util.List;

import org.junit.Test;


public class CSVReaderTest {

private CSVReader csvReader = null;

public CSVReaderTest() {
csvReader = new CSVReader();
}

@Test
public void testCsvFileReader() throws IOException {
List<List<String>> list = csvReader.csvFileReader("sample.csv");
List<String> testList = list.get(1);
assertEquals(2, list.size());
assertEquals("たれみ\nみうさぎ", testList.get(0));
assertEquals("ホーランド,ロップ", testList.get(1));
assertEquals("ミニ\nレッキス\"!\"アンドレッキス", testList.get(2));
}
}


-----------------------------------------------------------------------

CSVReaderTest.java を右クリックし 実行 => JUnitをクリックします



みみたれうさぎの実用Javaプログラムの考察

緑色のバーになれば成功です。


CSVファイルの2行目に書かれたウサギ達の名前が正しくよめれば成功です。

このassertEquals() の左辺と右辺が一致すると緑色になります。


これを見てめんどくさいな~ と思ったかもしれませんが


プログラムの単体テストを怠ると、それを結合テストに先送りしなければなりません。


結合テストで拾いきれないバグは本番環境へ流れていきます。


こんな小さなプログラムならば良いですが、規模が大きくなるとモジュールの変更が

どこまで影響するのかわからないので、


プログラムを修正してはJUnitをキックする


と言う習慣をつけましょう。実際の開発ではこれをやったのとやっていないので差がでてきます。


WebやバッチでのJUnitテストについてはまた日を改めて・・・



なお、ブログに書いてある内容がわかりづらいORコンパイルしたがうまく動かない 「まちがっとるぞー」

という場合はレスしてください。できるだけ修正いたします。




eclipseについての無難なマニュアルが欲しい方は↓に無難な本があります。

CDもついているので気軽にeclipseの機能を試せます。

Eclipse 3.5 完全攻略/宮本 信二
¥2,940
Amazon.co.jp


クルマだって何だって部品のテストをしない製品の品質なんて、たかが知れてるよね
と思われた方は↓をクリック


人気ブログランキングへ



SunがOracleに買収されてからあまり良い事がないです。


jdk-1.4は無くなっちゃったし


日本語 JDK 6 のドキュメントもいつの間にか無くなってしまいました。


http://download.java.net/jdk/jdk-api-localizations/jdk-api-ja/builds/latest/zip/jdk-6-doc-ja-ea.zip


で一応落とせますので、必要な方はお試しくださいませ。



柴田望洋さんの本は入門者の登竜門


明解Java 入門編/柴田 望洋
¥2,730
Amazon.co.jp

Sun SJC-Pを取るなら

SUN教科書 Javaプログラマ(SJC-P) 5.0・6.0両対応(試験番号310-055、.../ポール・サンヘラ
¥3,990
Amazon.co.jp






下記のサイトからSuperCSVというライブラリを
ダウンロードして解凍します。

http://supercsv.sourceforge.net/

そして、以下のjarファイルをeclipseの適当なフォルダにコピーして
jarファイルにマウスカーソルを乗せて右クリック=>ビルドパスに追加をしてください。


・SuperCSV-with_src-1.52.jar
・spiffy-with_source-all-0.05.jar



そして、以下のようなコードを書いて実行してみてください。
----------------------------------------------------------

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.List;

import org.supercsv.io.CsvListReader;
import org.supercsv.io.ICsvListReader;
import org.supercsv.prefs.CsvPreference;


public class CSVTest2 {

public static void main(String[] args) {
try {


ICsvListReader reader = new CsvListReader(

new FileReader("sample.csv"), CsvPreference.EXCEL_PREFERENCE);



List<String> list = null;
while ((list = reader.read()) != null){
for (String str : list) {
System.out.print(str);
}
System.out.println();
}
} catch (FileNotFoundException e) {
System.out.println("ファイルがないです");
} catch (IOException e) {
System.out.println("読み込みでエラーになりました");
}
}
}

----------------------------------------------------------

sample.csv


列1,列2,列,列4
"たれみ
みうさぎ","ホーランド,ロップ","ミニ
レッキス""!""アンドレッキス"

----------------------------------------------------------

実行結果


列1列2列列4
たれみ
みうさぎホーランド,ロップミニ
レッキス"!"アンドレッキス

----------------------------------------------------------


いかがでしょうか?

赤字の1行でCSVファイルの取り込み準備ができてしまいました。

あとはループで回して取得するだけです。


なーんだ、ライブラリ使っただけじゃん!
と思ったかもしれません。

でも、実際の現場ですでに誰かが書いたプログラムをもう一度自分
で一から書くという行為にどのくらいの意味があるのでしょうか?


ライブラリを作った人よりもコーディングが上手で、ものすごい
勢いでキーを叩ける人は別だと思います。
しかし、そうでない人は

 ・これから書こうとするソースをすでに誰かが書いていないかをチェックし

 ・見つけたら良さそうかどうか見極め
 ・自分がこれから作ろうとするシステムで使っても耐えられるかをテストし
 ・サクっと使いこなす

という技術も必要なのではないでしょうか?

よく、何もかも1から書こうとする人を現場で見かけますが自作するのは探しても

見つからない場合にとどめたほうが良いでしょう。



次回は

「自分がこれから作りたいシステムで使用しても耐えられるかをチェック」

するにはどうするか?について書いてみたいと思います。


耳たれうさぎの実用Javaプログラムの考察


eclipseについての無難なマニュアルが欲しい方は↓に無難な本があります。

CDもついているので気軽にeclipseの機能を試せます。

Eclipse 3.5 完全攻略/宮本 信二
¥2,940
Amazon.co.jp

なんだライブラリかよと思いつつ、確かに全部書くのはムダだよねと同意された方は
↓をクリック
人気ブログランキングへ



Eclipse 3.5 完全攻略/宮本 信二
¥2,940
Amazon.co.jp



開発の現場ではよくCSVファイルの読み書きを行わなければならない場面があります。

みなさんはどのようにしているでしょうか?例えば以下のようなコードを書くとCSVファイルを

読むことができますが・・・(汗


---------------------------------------------------------------

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

/**
* CSVファイルを読み込む簡単なサンプルプログラム
* @author たれ耳うさぎ
*
*/
public class CSVTest1 {

public static void main(String[] args) {

try{

BufferedReader buffer = null;
buffer = new BufferedReader(new FileReader("sample.csv"));

while(buffer.ready()){
String str = buffer.readLine();
String[] strList = str.split(",");
for (String string : strList) {
System.out.print(string);
}
System.out.println();
}

}catch(FileNotFoundException e){
System.out.println("ファイルがないです");
}catch(IOException e){
System.out.println("読み込みでエラーになりました");
}
}
}
---------------------------------------------------------------

sample.csv


列1,列2,列,列4
ネザーランドドワーフ,ホーランドロップ,レッキス,ミニウサギ

---------------------------------------------------------------

実行結果


列1列2列列4
ネザーランドドワーフホーランドロップレッキスミニウサギ

---------------------------------------------------------------

さて、いくつか問題点があります。


文字列の途中に 「,」 や「改行」 があった場合はどうでしょうか?

CSVファイルの仕様ではこれらの文字があった場合は、その文字列全体を「"」で

エスケープすることになっています。さらに

文字列中に「"」があった場合は直前にもう1つ「"」を置く

などいろいろルールがあります。


以上のような点を考慮し下記のようなファイルを読んだときに正しい実行結果を

得る方法はどうするか?


実は、このようなケースでサクっと問題を解決しようというのが当ブログのコンセプト

(大げさ)になります。


---------------------------------------------------------------

sample2.csv


"たれみ
みうさぎ","ホーランド,ロップ","ミニ
レッキス""!""アンドレッキス"

---------------------------------------------------------------

実行結果(予定)


たれみ
みうさぎホーランド,ロップミニ
レッキス"!"アンドレッキス



明日はこのようなファイルをサクっと読む方法について書きます


CSVファイルをサクっと扱う方法に期待された方は
↓をクリック
人気ブログランキングへ



eclipseについてのマニュアルが欲しい方は↓に無難な本があります。

CDもついているので気軽にeclipseの機能を試せます。

Eclipse 3.5 完全攻略/宮本 信二
¥2,940
Amazon.co.jp

eclipseで適当なオブジェクトにカーソルを当てると

javadoc could be found と出てしまいます。


以下からドキュメントをダウンロードし(昔はSunからダウンロードできました)

以下の手順で設定するとAPI(日本語版)が直接見られるようになります。


http://download.java.net/jdk/jdk-api-localizations/jdk-api-ja/builds/latest/zip/jdk-6-doc-ja-ea.zip


rt.jar を右クリック => javadoc ロケーション => jdk-6-doc-ja-ea.zip  => パス: docs/ja/api


とします。


すると、オブジェクトにカーソルを合わせるとAPIが見られるようになります。



耳タレうさぎの実用Javaプログラムの考察

マウスカーソルを合わせるだけでAPIが見れて便利と思われた方は
↓をクリック
人気ブログランキングへ