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

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

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

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

Q&A

解決済

1回答

1100閲覧

csvの正しい保存の仕方とは?

Seeker

総合スコア33

Java

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

0グッド

0クリップ

投稿2022/05/26 17:09

使用環境
window 10Home
eclipse: 2022-03 
orangesignal-csv-2.2.1

前回
https://teratail.com/questions/8ng9q7802mglso
で質問した所、同じコードを打ってみたものの、どういうわけかエラーが出てしまい
進みません。なぜ進まないのかがよくわかりません。

恐らく、CSVの保存に問題があるのではと思いますが、
果たしてどうなのでしょうか。

出てくるエラーコード

Exception in thread "main" java.lang.IllegalStateException: Invalid CsvColumn field prefature at com.orangesignal.csv.bean.CsvEntityTemplate.getPosition(CsvEntityTemplate.java:258) at com.orangesignal.csv.io.CsvEntityReader.convert(CsvEntityReader.java:298) at com.orangesignal.csv.io.CsvEntityReader.toEntity(CsvEntityReader.java:228) at com.orangesignal.csv.handlers.CsvEntityListHandler.load(CsvEntityListHandler.java:104) at com.orangesignal.csv.handlers.AbstractCsvListHandler.load(AbstractCsvListHandler.java:76) at com.orangesignal.csv.handlers.AbstractCsvListHandler.load(AbstractCsvListHandler.java:1) at com.orangesignal.csv.Csv.load(Csv.java:69) at com.orangesignal.csv.Csv.load(Csv.java:83) at com.orangesignal.csv.Csv.load(Csv.java:112) at com.orangesignal.csv.Csv.load(Csv.java:148) at com.orangesignal.csv.manager.AbstractCsvLoader.from(AbstractCsvLoader.java:132) at cse5.Main.main(Main.java:13)

Main.java

1package cse5; 2 3import java.io.File; 4import java.io.IOException; 5import java.util.List; 6 7import com.orangesignal.csv.manager.CsvEntityManager; 8 9public class Main { 10 11 public static void main(String[] args) { 12 try { 13 List<Product> list = new CsvEntityManager().load(Product.class).from(new File("PrefatureSet3.csv")); 14 for(Product product : list) System.out.println(product); 15 } catch(IOException e) { 16 e.printStackTrace(); 17 } 18 } 19 20 } 21

Product.java

1package cse5; 2 3import com.orangesignal.csv.annotation.CsvColumn; 4import com.orangesignal.csv.annotation.CsvEntity; 5 6@CsvEntity 7public class Product { 8 @CsvColumn(name = "都道府県名") 9 private String prefature; 10 @CsvColumn(name = "人口") 11 private int population; 12 @CsvColumn(name = "高齢者率") 13 private double oldPercent; 14 @CsvColumn(name = "地方") 15 private String domestic; 16 17 @Override 18 public String toString() { 19 return new StringBuilder("Product") 20 .append(" [prefature=").append(prefature) 21 .append(", population=").append(population) 22 .append(", oldPercent=").append(oldPercent) 23 .append(", domestic=").append(domestic) 24 .append("]").toString(); 25 } 26}

PrefatureSet3.csv

1都道府県名,人口,高齢者率,地方 2北海道,5228885,0.29 ,北海道 3青森県,1238730,0.30 ,東北 4岩手県,1211206,0.30 ,東北 5宮城県,2303487,0.25 ,東北 6秋田県,960113,0.34 ,東北 7山形県,1068696,0.31 ,東北 8福島県,1834198,0.28 ,関東 9茨城県,2868554,0.27 ,関東 10栃木県,1934016,0.26 ,関東 11群馬県,1940333,0.27 ,関東 12(以下略)

やった事
・WPS SpredSheetsで「Prefature Set.csv」として保存する
・「Prefature Set.csv」をメモ帳のプログラムで開く
・名前を付けて保存「Prefature Set3.csv」という名前で文字コード「UTF-8」として保存する

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

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

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

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

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

swordone

2022/05/26 18:32

高齢者率の数字のあとに空白があるのはなぜです?
Seeker

2022/05/26 18:45

意図的に起こしたわけではないですが・・・恐らく 元々 Prefature Setのファイルの前のファイルのデータでは 0.30の所とかは30%という風に%表記であったので それを計算のために変更しました。 その過程で空いたのかと思います。
dodox86

2022/05/27 01:38

> 名前を付けて保存「Prefature Set3.csv」という名前で文字コード「UTF-8」として保存する (BOMが付いていない)UTF-8で保存されたのだと思いますが、それはそれで良いとして > new CsvEntityManager().load(Product.class).from(new File("PrefatureSet3.csv")); とあるので、orangesignalで扱う際のファイルの文字コードが合っていないのではないでしょうか。 試しに日本語全角文字を使わないよう(ローマ字などのダミーデータとして)CSVファイルを作って試してみてはいかがでしょう。
Seeker

2022/05/27 04:24

説明がされたダミーデータで行いました所(項目名をローマ字読みしたものに変えた)。 上記で示されたエラーが消えたものの、今度は別なエラーが出てきました Exception in thread "main" java.lang.IndexOutOfBoundsException: Index 1 out of bounds for length 1 どういうことでしょうか
guest

回答1

0

ベストアンサー

ソースはそのままで実行したら、こんなんでましたけど。

都道府県名,人口,高齢者率,地方 北海道,5228885,0.29 ,北海道 青森県,1238730,0.30 ,東北 岩手県,1211206,0.30 ,東北 宮城県,2303487,0.25 ,東北 秋田県,960113,0.34 ,東北 山形県,1068696,0.31 ,東北 福島県,1834198,0.28 ,関東 茨城県,2868554,0.27 ,関東 栃木県,1934016,0.26 ,関東 群馬県,1940333,0.27 ,関東

ソース以外の変更点は、以下。

diff

1diff --git a/PrefatureSet3.csv b/PrefatureSet3.csv 2--- a/PrefatureSet3.csv (revision 40dc83e530bb2eb873151aa9c30f58cad0697e13) 3+++ b/PrefatureSet3.csv (date 1653630303246) 4@@ -8,5 +8,4 @@ 5 福島県,1834198,0.28 ,関東 6 茨城県,2868554,0.27 ,関東 7 栃木県,1934016,0.26 ,関東 8-群馬県,1940333,0.27 ,関東 9-(以下略) 10\ No newline at end of file 11+群馬県,1940333,0.27 ,関東 12\ No newline at end of file

なお、orangesignal-csvについては、完全なる無知です。

投稿2022/05/27 05:48

shiketa

総合スコア3971

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

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

Techann

2022/05/27 11:02

すいません、コレはどういう意味となるのでしょうか? 普通に読み込めているという解釈なのか それとも 〇〇の所が読み込めていませんという解釈なのか……よくわかりません
shiketa

2022/05/27 14:16 編集

PrefatureSet3.csvの最後の「(以下略)」の行を削除して、最後の行の行末の改行文字を削除したら、例外は発生せず、件のような結果が出力された、ということ。 最後の行に改行文字を付加すると、Exception in thread "main" java.lang.IndexOutOfBoundsException: Index 1 out of bounds for length 1 が発生する。改行文字を取れば発生しない。最後の行を`aaa,123`にすると、Exception in thread "main" java.lang.IndexOutOfBoundsException: Index 2 out of bounds for length 2 が発生する。 orangesignal-csvは、最終行の扱いに問題を抱えているのではないでしょうか。
Seeker

2022/05/27 16:24

ありがとうございます。 別なライブラリが使えないか検討してみます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問