GIG

赴くままに技術を。

CSVファイルを読み込む

CSVファイルからJava Beanを作りたく、ここを参考にしてみたので、めもめもφ(-ω-)

pom.xmlに依存するライブラリを記述

Apache Common-IOは必要ないけど、CSVファイルかどうかのチェックに利用している。

■pom.xml

    <!-- opencsv -->
    <dependency>
        <groupId>net.sf.opencsv</groupId>
        <artifactId>opencsv</artifactId>
        <version>2.3</version>
    </dependency>

パースしたいデータを用意

パースしたいcsvファイルは以下。

■src/test/resources/test.csv

最初のカラムからそれぞれユーザ名、プロジェクト名、マネージャフラグとする。

    # userName, projectName, isManager
    "user01", "proj01", true
    "user02", "proj01", false
    "user03", "proj01", false

Beanにデータをマッピング

そして、上記のデータを今回は以下のBeanにマッピングする。

■Bean.java

    public class Bean {
    
        private String userName;
        private String projectName;
        private boolean isManager;

        (getter, setterは割愛)
    }

それでは実装のほう。

CSVReaderはオーバーロードされている。 使うのは以下のメソッド

public CSVReader(Reader reader,
                            char separator,
                            char quotechar,
                            int line)

Constructs CSVReader with supplied separator and quote char.

Parameters:
    reader - the reader to an underlying CSV source. 
    separator - the delimiter to use for separating entries (区切り文字を指定)
    quotechar - the character to use for quoted elements (文字列のクォーテーションを指定)
    line - the line number to skip for start reading (ファイルの最初から何行目までスキップするか指定)

■Csvparser.java

   /**
     * CSVファイルからデータを読み込むメソッド .
     * @param fileName 該当ファイルパス
     * @return パースしたJava Beanのリスト
     */
    public List<Bean> readFromCsvFile(String fileName) {
        InputStreamReader isr = null;
        List<Bean> list = null;
        try {
            try {
                isr = new InputStreamReader(new FileInputStream(fileName), "UTF-8");
                CSVReader reader = new CSVReader(isr, ',', '"', 1);
                
                ColumnPositionMappingStrategy start = new ColumnPositionMappingStrategy();
                start.setType(Bean.class);

                String[] columns = new String[]{"userName", "projectName", "isManager"};
                start.setColumnMapping(columns);
                
                CsvToBean csv = new CsvToBean();
                list = csv.parse(start, reader);

            } catch (FileNotFoundException ex) {
                ex.printStackTrace();
            }
        } catch (UnsupportedEncodingException ex) {
            ex.printStackTrace();
        } finally {
            try {
                isr.close();
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }
        return list;
    }

    /**
     * ファイルがExcelファイルかCSVファイルであるか確認するメソッド .
     * @param inputFile 対象ファイル
     * @return Excelファイルか否か
     */
    public boolean isFileValid (String inputFile){
        boolean isValid = false;
        if (inputFile != null) {
            if (inputFile.endsWith("xls") || inputFile.endsWith("xlsx") || inputFile.endsWith("csv")) {
                isValid = true;
            }
        }
        return isValid;
    }

動作を確認

最後にこのクラスを利用してCSVからJava Beanが取得できることを確認する。

■EjbTest.java

    private  Csvparser sut = null;

    @Before
    public void setUp() {
        sut = new Csvparser();
    }
    
    @After
    public void tearDown() {
        sut = null;
    }

    @Test
    public void testReadFromCsvFile() {

        List<Bean> list = sut.readFromCsvFile("src/test/resources/test.csv");

        assertNotNull(list);

        assertThat(list.get(0).getUserName(), is("user01"));
        assertThat(list.get(0).getProjectName(), is("proj01"));
        assertThat(list.get(0).isIsManager(), is(true));

        assertThat(list.get(1).getUserName(), is("user02"));
        assertThat(list.get(1).getProjectName(), is("proj01"));
        assertThat(list.get(1).isIsManager(), is(false));

        assertThat(list.get(2).getUserName(), is("user03"));
        assertThat(list.get(2).getProjectName(), is("proj01"));
        assertThat(list.get(2).isIsManager(), is(false));
    }