使用環境
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」として保存する
高齢者率の数字のあとに空白があるのはなぜです?
意図的に起こしたわけではないですが・・・恐らく
元々 Prefature Setのファイルの前のファイルのデータでは
0.30の所とかは30%という風に%表記であったので
それを計算のために変更しました。
その過程で空いたのかと思います。
> 名前を付けて保存「Prefature Set3.csv」という名前で文字コード「UTF-8」として保存する
(BOMが付いていない)UTF-8で保存されたのだと思いますが、それはそれで良いとして
> new CsvEntityManager().load(Product.class).from(new File("PrefatureSet3.csv"));
とあるので、orangesignalで扱う際のファイルの文字コードが合っていないのではないでしょうか。
試しに日本語全角文字を使わないよう(ローマ字などのダミーデータとして)CSVファイルを作って試してみてはいかがでしょう。
説明がされたダミーデータで行いました所(項目名をローマ字読みしたものに変えた)。
上記で示されたエラーが消えたものの、今度は別なエラーが出てきました
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index 1 out of bounds for length 1
どういうことでしょうか
回答1件
あなたの回答
tips
プレビュー