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

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

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

Q&A

解決済

2回答

3065閲覧

JavaでCSVファイルを取得して、データをJSON形式にしたい。

asuka.Mir

総合スコア15

0グッド

0クリップ

投稿2022/12/22 14:09

前提

Javaの勉強でCSVファイルを取得してそのファイル内のデータをJSON形式にするプログラム作っています。
しかし、以下のようになっております。
・文字化けしている。
・JSON形式が想定でない。

以上、2点を解決するにはどのようにコードを修正すれば手詰まりになっています。
お手数ですが、ご協力をお願いいたします。

CSVファイルの中身と想定のJSON形式

【Zukan.csv】
ID Name Type
1 ニャオハ 草
2 クワッス 水
3 ホゲータ 炎
4 パモ 電気
5 グルトン 無

【想定のJSON形式】
{"ID": ["Name", "Type"],"1": ["ニャオハ", "草"],"2": ["クワッス", "水"],"3": ["ホゲータ", "炎"],"4": ["パモ", "電気"],"5": ["グルトン", "無"]}

現状の結果

[["ID","Name","Type"],["1","�j���I�n","��"],["2","�N���b�X","��"],["3","�z�Q�[�^","��"],["4","�p��","�d�C"],["5","�O���g��","��"]]

ソースコード

Java

1import java.io.BufferedReader; 2import java.io.File; 3import java.io.FileReader; 4import java.nio.file.Path; 5import java.nio.file.Paths; 6import java.util.ArrayList; 7import java.util.List; 8 9import com.fasterxml.jackson.databind.ObjectMapper; 10 11public class CsvtoJsonSample { 12 public static void main(String[] args) { 13 Path csvPash = Paths.get("C:\\Zukan.csv"); 14 BufferedReader br = null; 15 String json = null; 16 // データを格納するリスト 17 List<String[]> data = new ArrayList<String[]>(); 18 try { 19 File file = new File(csvPash.toString()); 20 br = new BufferedReader(new FileReader(file)); 21 ObjectMapper mapper = new ObjectMapper(); 22 // readLineで一行ずつ読み込む 23 String line; 24 while ((line = br.readLine()) != null) { 25 // lineをカンマで分割し、配列リストdataに追加 26 data.add(line.split(",")); 27 } 28 System.out.println(data); 29 json = mapper.writeValueAsString(data); 30 System.out.println(json); 31 32 } catch (Exception e) { 33 } 34 } 35}

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

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

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

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

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

jimbe

2022/12/22 14:39

まず、 Zukan.csv が CSV ではありませんが。
mike2mike4

2022/12/22 14:54

あと、文字コードをUTF-8にすれば解決するんじゃ?
jimbe

2022/12/22 15:54 編集

想定は配列の配列ではありませんので、それだけでは… 入出力形式が決まっているのならマッパーなんて要らないんですけど。
xebme

2022/12/22 22:29

出力されたJSON形式は正しいと思います。 【想定のJSON形式】を作るためのオブジェクトはどんな構造ですか。 JSONの定義を確認してみましょう。
退会済みユーザー

退会済みユーザー

2022/12/22 23:03

どうしても【想定のJSON形式】である必要はなく、「現状の結果」で文字化けが直れば良いのであれば、CSV ファイルの文字コードとプログラムがファイルを読むときに使う文字コードを合わせれば解決すると思います。
guest

回答2

0

文字コードにつきましては質問へのコメントやTN8001さんが回答でご指摘の通りと思います。
実行時に java のオフションを指定するか、 Reader を生成する際に文字コードを指定するかでしょう。

変換自体は、単に json の文字列にするだけなら文字列編集で済ませられるでしょう。

java

1//テスト 2BufferedReader br = new BufferedReader(new StringReader("ID,NAME,TYPE\n1,aaa,bbb")); 3 4StringJoiner sj = new StringJoiner(",","{","}"); 5for(String line; (line=br.readLine()) != null; ) { 6 sj.add(String.format("\"%s\":[\"%s\",\"%s\"]",line.split(","))); 7} 8String json = sj.toString(); 9 10System.out.println(json); //{"ID":["NAME","TYPE"],"1":["aaa","bbb"]}

投稿2022/12/23 16:27

編集2022/12/23 16:32
jimbe

総合スコア13088

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

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

0

ベストアンサー

・文字化けしている。

文字化けしたら、まずファイルフォーマットを確認してください。
おそらくシフトJIS(MS932)を、UTF-8で開いていると思います。

・JSON形式が想定でない。

想定のJSONは、「キーと値のペアの集まり」です。
List<String[]>ではなく、Map<String, String[]>ということです。
JavaScript Object Notation - Wikipedia
Map (Java Platform SE 8 )

Java

1import com.fasterxml.jackson.databind.ObjectMapper; 2 3import java.io.IOException; 4import java.nio.charset.Charset; 5import java.nio.file.*; 6import java.util.*; 7 8 9public class CsvtoJsonSample { 10 public static void main(String[] args) throws IOException { 11 var csvPash = Paths.get("Zukan.csv"); 12// dummy(csvPash); 13 14 var data = new HashMap<String, String[]>(); 15// var data = new LinkedHashMap<String, String[]>(); 16 17 try (var br = Files.newBufferedReader(csvPash, Charset.forName("MS932"))) { 18 String line; 19 while ((line = br.readLine()) != null) { 20 var array = line.split(","); 21 var key = array[0]; // 先頭 22 var value = Arrays.copyOfRange(array, 1, array.length); // 先頭を除く残り全部 23 data.put(key, value); 24 } 25 26 var mapper = new ObjectMapper(); 27 var json = mapper.writeValueAsString(data); 28 System.out.println(json); 29 } catch (Exception e) { 30 e.printStackTrace(); 31 } 32 } 33 34// private static void dummy(Path csvPash) throws IOException { 35// var csv = """ 36// ID,Name,Type 37// 1,ニャオハ,草 38// 2,クワッス,水 39// 3,ホゲータ,炎 40// 4,パモ,電気 41// 5,グルトン,無"""; 42// Files.writeString(csvPash, csv, Charset.forName("MS932")); 43// } 44}

json

1{"1":["ニャオハ","草"],"2":["クワッス","水"],"3":["ホゲータ","炎"],"4":["パモ","電気"],"5":["グルトン","無"],"ID":["Name","Type"]}

JSON的には順不同ですが、順番が気になるならLinkedHashMapを使用してください。

投稿2022/12/23 09:43

TN8001

総合スコア9711

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

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

xebme

2022/12/24 13:16

【想定のJSON形式】はそもそもJSONの形式かという疑問があります。 名前はオブジェトのフィールド(構造)に相当するので、JSONは {ID:値,NAME:値,TYPE:値}のようになるのではないか、... 。 名前 : 値、となるべきところが、値 : 値(の配列)となっているように思います。 {KEY:"1",VALUE:["ニャオハ","草"]}ならJSONの形式。
TN8001

2022/12/24 14:09 編集

まあ私もcsvと対応するjsonとしては、使いづらそうだなと思います(そもそもキーが不定(連番)がイヤですね^^; こうだったら楽なんですが... [ {"ID":1, "Name":"ニャオハ", "Type":"草"}, ・・・ ] でも「想定のJSON形式」ということは自分で使うというより、何かのアプリなりがそれを要求しているのかな?って思ってました。
jimbe

2022/12/24 17:53 編集

java のオブジェクトで考えると変かもしれませんが JavaScript のオブジェクト(連装配列)ならあっているように思います。 実際回答のコードは動作していますし。
xebme

2022/12/24 23:18 編集

TN8001さん、jimbeさんありがとうございます。疑問をまとめます。 ・JSONの表記とオブジェクトの構造は一致しているか  javascriptを基準とすれば一致するが、他の言語では一致しないことがある  より積極的には、表記が正しければ、構造が一致しなくても良い とすれば、次のようなことが言えます ・表記と構造が不一致の場合、マッピング機能が必要な場合がある ・マッピング機能はObjectMapperでなくても良いだろう
TN8001

2022/12/25 02:18

> 疑問をまとめます。 すいません。論点がよくわかりません;; * 少なくともjson的にはvalidである * JSでは扱いやすい構造かもしれないが、他言語ではつらいときもある * 文字数削減のため構造をゆがませたりするのも作成者次第(そんなのイヤすぎるがw 「想定のJSON形式」の出どころ?がわからないので何とも言えませんが... 「Javaの勉強」ということなので、**入出力は決まっていて** その実装で練習&趣味の実益(ポケモンツール間のデータ変換かなんか)を兼ねているのかなと読みました。 jacksonを使うこと自体がテーマかもしれないので、提示コードはあまりいじらない方向で回答しました^^
xebme

2022/12/26 06:39

>すいません。論点がよくわかりません;; javascriptでJSONに変換できるとのこと、言うことが気取って曲がってしまいました。 >* 文字数削減のため構造をゆがませたりするのも作成者次第(そんなのイヤすぎるがw これに近いです。 疑問は、JSONの名前は、構造( メタデータやオブジェクトのフィールド)を表さなくてもよいのか (名前が構造を表さなければ無理なマッピングをしなければならないだろう)、です。 有益なコメントにならなくて申し訳ありません。自分で考えてみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.39%

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

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

質問する

関連した質問