#author("2017-07-10T21:41:17+09:00","","")
#author("2017-07-10T21:44:44+09:00","","")
#navi(../)
* CSV取込みサンプルを作ってみた [#g9b7d438]
CSVファイルを1行ずつ読み込み、Stringのsplitで分割し、ArrayListに格納するサンプルを以下に記します。

#contents

* 注意事項 [#r12a01ff]
本サンプルソースは、ファイルの読み込み部分を[[try-with-resources>http://docs.oracle.com/javase/jp/7/technotes/guides/language/try-with-resources.html]]で記述していますので、Java7以降でコンパイルおよび実行してください。~
本サンプルソースは、ファイルの読み込み部分を[[try-with-resources>http://docs.oracle.com/javase/jp/7/technotes/guides/language/try-with-resources.html]]で記述していますので、''Java7''以降でコンパイルおよび実行してください。~
テキストファイルの読み込みについては以下の記事を参考にしてください。
-[[テキストファイルの読み込みサンプルソース>ファイル操作/テキストファイルの読み込み]]

* CSV取込みサンプルソース [#q10cf2c4]
本サンプルソースは、引数で渡されたファイルの有無を調べます。~
ファイルが存在しない場合は、処理を中断します。~
引数が未指定の場合は、usage()が呼び出され処理を中断します。~
ファイルの文字コードについては、System.getProperty("file.encoding")でデフォルトの文字コードを取得しています。

引数に指定されたファイルを開き、カンマ(,)でsplitしたStringの配列(String[])をArrayListに追加しています。~
その後、幅10で(%10s)でCSVを整形し表示しています。~
尚、全角の場合はString.formatの%sでは、半角分広がり崩れてしまいますが、サンプルソースなので表示の崩れ対応はしていません。~
ListにStringの配列で格納すれば、以後、編集が楽であろうと思い作成したサンプルソースになります。

&ref(); LF
&ref(ReadCsv.java); LF
 import java.util.List;
 import java.util.ArrayList;
 import java.io.BufferedReader;
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.InputStreamReader;
 import java.io.FileNotFoundException;
 import java.io.IOException;
 
 class ReadCsv {
     String csvfile;
 
     private String getCsvFilename() {
         return this.csvfile;
     }
 
     private void setCsvFilename(String s) {
         this.csvfile = s;
     }
 
     private void usage() {
         System.err.println("Usage: java ReadCsv <csv file>");
     }
 
     // constructor
     ReadCsv(String[] args) {
         // check args
         if (args.length != 1) {
             usage();
             System.exit(1);
         }
         // check file
         if (!(new File(args[0])).exists()) {
             System.err.println(args[0] + ": file not found.");
             System.exit(2);
         }
         // set csv filename
         setCsvFilename(args[0]);
     }
 
     // read csvfile
     private List<String[]> readCsvfile2Array() {
         String csv = this.getCsvFilename();
         List<String[]> csvList = new ArrayList<String[]>();
         try (BufferedReader br = new BufferedReader(
             new InputStreamReader(
                 new FileInputStream(csv), System.getProperty("file.encoding")))) {
             String l = br.readLine();
             while (l != null) {
                 csvList.add(l.split(","));
                 l = br.readLine();
             }
         } catch (FileNotFoundException e) {
             System.err.println(csv + " not found.");
         } catch (IOException e) {
             System.err.println("I/O error.");
         } catch (Exception e) {
             e.printStackTrace();
         }
 
         return csvList;
     }
 
     // main
     public static void main(String[] args) {
         ReadCsv me = new ReadCsv(args);
         List<String[]> csvList = me.readCsvfile2Array();
         // display csvList
         if (csvList != null) {
             System.out.printf("%d line\n", csvList.size());
             for (String[] s : csvList) {
                 String l ="|";
                 for (int i = 0; s.length > i; i++) {
                     l += String.format("%10s|", s[i]);
                 }
                 System.out.println(l);
             }
         }
     }
 }

* 実行結果 [#a6628b91]
上記のサンプルソースをコンパイルして実行してみます。~
使用したCSVファイルは以下の通りです。

&ref(data.csv); UTF-8, LF
 Java,Ruby,Python,Perl,PHP
 10,20,30,40,50
 あ,い,う,え,お

+ コンパイルします。
 $ javac ReadCsv.java 
#br
+実行します。
 $ java ReadCsv data.csv 
 3 line
 |      Java|      Ruby|    Python|      Perl|       PHP|
 |        10|        20|        30|        40|        50|
 |         あ|         い|         う|         え|         お|

ちなみに引数なし、引数に指定したファイルがない場合は以下のような出力となります。
 $ java ReadCsv
 Usage: java ReadCsv <csv file>
 $ java ReadCsv foo.csv
 foo.csv: file not found.

以上、JavaでCSVファイルを読み込み、加工しやすい?ListにString[]で格納するサンプルソースでした。



トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS