- 追加された行はこの色です。
- 削除された行はこの色です。
#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[]で格納するサンプルソースでした。