質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

1回答

5773閲覧

JavaのCSVライブラリ(OrangeSignal CSV)を使用して指定のカラムのみ読み込みたい

javabigineer

総合スコア87

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2016/02/24 08:27

JavaのCSVライブラリ(OrangeSignal CSV)を使用して指定のカラムのみ読み込もうとしてます。

【CSVファイル内】
aaaa,bbbb,ccc,dd,eee(ヘッダー列)
値1,値2,値3,値4,値5
ああ,いい,うう,ええ,おお

【やりたいこと】
上記のようなカンマ区切りのCSVのうち、
3カラム目(ccc,値3,うう)を除く他のカラムを
取得して別CSVファイルに吐き出したいです。

【現状】
現在、以下のようになっています。

CSVファイルを読み込んだ後、リスト内の配列の値を削除してます。
本来読み込むときに、値を絞れると思っていたのですが、
行を読み飛ばすことはできても
列を読み飛ばすことができませんでしたので、以下のようになっています。

ただし、削除するメソッドにて
Exception in thread "main" java.lang.UnsupportedOperationException
at java.util.AbstractList.remove(AbstractList.java:144)
at CSVLogic.narrow(CSVLogic.java:63)
at Main.main(Main.java:58)
のエラーが出ています。

<CSVを読み込むメソッド>
public List<String[]> csvRead
(String csvPath,String columnName){
//戻り値の設定
//List<String[]> rowList = new ArrayList<String[]>();
List<String[]> rowList = new LinkedList<String[]>();
try {
// 対象を絞って読み込み
rowList = Csv.load(new File(csvPath),"MS932", cfg, new StringArrayListHandler());

} catch (IOException e) { e.printStackTrace(); } return rowList;

}

<対象の列を削除するメソッド>
public List<String[]> narrow(List<String[]> rowList, int[] columnNum){
//戻り値の生成
List<String[]> redmineObjList = new ArrayList<String[]>();
// 除外対象のカラムを除去する
System.out.println("除去前"+rowList.get(0).length);

for(int num :columnNum){ for(String[] tmp : rowList){ List<String> tmplist = new ArrayList<String>(); tmplist = Arrays.asList(tmp); tmplist.remove(num); tmp = (String[]) tmplist.toArray(new String[tmplist.size()]); } } redmineObjList = rowList; System.out.println("除去後"+rowList.get(0).length); return redmineObjList;

}

以上、どなたかお力を貸してください。
よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

ここが間違っていますね。

lang

1List<String> tmplist = new ArrayList<String>(); 2tmplist = Arrays.asList(tmp);

これだとnewしたArrayListは捨てられて、tmplistArrays.asListで作った読み取り専用のリストに置き換わっています。

正しくは、

lang

1List<String> tmplist = new ArrayList<String>(Arrays.asList(tmp));

です。


(2016/02/25 11:37のコメントについて追記)

見落としていましたが、ここも正しくありません。

lang

1tmp = (String[]) tmplist.toArray(new String[tmplist.size()]);

おそらく列を削除した配列を書き戻したいんだと思いますが、
ここではString[] tmpは一時的な変数であって、これに代入しても元のrowListに書き戻すことはできません。
この行の代わりにredmineObjList.add(tmp);を追加します。

そして、ループの終わりのredmineObjList = rowList;を削除してください。
redmineObjList = rowList;は、最初にredmineObjListに代入したnew ArrayList<String[]>()を使わずに捨てる操作になっています。

投稿2016/02/24 09:28

編集2016/02/25 05:30
argius

総合スコア9388

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

javabigineer

2016/02/25 02:37

ご指摘のように修正しましたところ、エラーはでなくなりました。 しかし、remobveメソッドで列削除が行えていないようです。。。
argius

2016/02/25 05:30

回答に追記しました。 全体を通して、参照についての理解が正しくないと思いますので、その辺を復習されることをお勧めします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問