🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
CSV

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

for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

foreach

foreachは、List・Collection・Arrayといったデータ構造の各要素に対して繰り返し処理を実行するために扱われる、制御構造の構文です。

Java

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

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

Q&A

解決済

1回答

1880閲覧

JavaでCSVを出力する際にカテゴリー別に小計行を追加したい。

BomBooWood

総合スコア1

CSV

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

for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

foreach

foreachは、List・Collection・Arrayといったデータ構造の各要素に対して繰り返し処理を実行するために扱われる、制御構造の構文です。

Java

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

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

0グッド

0クリップ

投稿2020/12/19 02:54

編集2020/12/19 03:40

加工元データ

|NO|CATEGORY|PRICE|
|:--|:--|:--|
|1|Apple|100|
|2|Apple|100|
|3|Apple|100|
|4|Banana|100|
|5|Banana|100|
|6|Banana|100|
|7|Banana|100|
|8|Peach|100|
|9|Peach|100|
|10|Peach|100|

加工後データ(CSV)

|NO|CATEGORY|PRICE|
|:--|:--|:--|
|1|Apple|100|
|2|Apple|100|
|3|Apple|100|
||小計|300
|4|Banana|100|
|5|Banana|100|
|6|Banana|100|
|7|Banana|100|
||小計|400|
|8|Peach|100|
|9|Peach|100|
|10|Peach|100|
||小計|300|

したいことの説明

【加工元データ】のカテゴリー別の小計を計算するループ処理で、
各カテゴリーの下に小計の行を追加したいです。 *【加工後データ(CSV)参照】

Java

1@Getter 2@Setter 3class SumTable{ 4 private Integer no; 5 private String category; 6 private Integer price; 7} 8 9// 加工元データリスト 10List<SumTable> list = 加工元データをリストで取得; 11 12// 加工後データ格納リスト 13List<SumTable> csvList = new List<SumTable>(); 14 15// 集計処理 16Map<String,SumTable> map = new LinkedHashMap<>(); 17for(SumTable s : list){ 18 if(map.containsKey(s.getCategory())){ 19 20 } else { 21 22 } 23} 24 25// CSV出力 26return convertCsv(csvList);

小計行について

・No列の値は空文字
・Category列はCategory
・Price列はCategory別の合計

理想

本当に聞きたいことは、カテゴリーの列は複数あって
カテゴリー1>カテゴリー2>カテゴリー3ごとの集計をとる必要があります。
その点の背景を考慮していただきご教授していただけると非常に助かります。

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

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

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

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

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

dodox86

2020/12/19 04:22

CSVの元データで、カテゴリーが必ず連続しているのであればカテゴリーが変わった時点で集計結果を1行出力すればよいだけだし、カテゴリーがとびとびに登録されているのであれば、集計後に並べ直して出力する必要があります。
BomBooWood

2020/12/19 23:28

カテゴリーが変わった時点のコードの書き方に戸惑っている状況です。
guest

回答1

0

ベストアンサー

  1. キーになる項目ごとに分ける。
  2. 分けたものを出力する
  3. 分けたものを集計して出力する
  4. キーが複数あるなら、分けたものをさらに分ける

Javaで書くのはめんどうなので、サンプルはKotlinで書きます。StreamにもgroupBy(), sum() があるはずなので書けるでしょう。もっともStreamを使わずとも書けます。

kotlin

1object HogeSum { 2 @JvmStatic 3 fun main(args: Array<String>) { 4 dataList 5 .groupBy { data: Data -> data.catagory } 6 .forEach { (catagory: String, list: List<Data>) -> 7 list.forEach { data: Data -> 8 println(data.toCSV()) 9 } 10 11 val sum = list.sumOf { data: Data -> data.price } 12 println(listOf("", "小径(${catagory})", sum).joinToString(",")) 13 } 14 } 15 16 // 17 data class Data( 18 val no: Int, 19 val catagory: String, 20 val price: Int 21 ) { 22 fun toCSV() = 23 listOf(no, catagory, price).joinToString(",") 24 } 25 26 // 27 val dataList = listOf( 28 Data(1, "Apple", 100), 29 Data(2, "Apple", 100), 30 Data(3, "Apple", 100), 31 Data(4, "Banana", 100), 32 Data(5, "Banana", 100), 33 Data(6, "Banana", 100), 34 Data(7, "Banana", 100), 35 Data(8, "Peach", 100), 36 Data(9, "Peach", 100), 37 Data(10, "Peach", 100) 38 ) 39 .shuffled() // あえて、まぜる 40} 41

元データをかき回しているので順序はランダムです。

10,Peach,100 9,Peach,100 8,Peach,100 ,小径(Peach),300 1,Apple,100 2,Apple,100 3,Apple,100 ,小径(Apple),300 4,Banana,100 7,Banana,100 6,Banana,100 5,Banana,100 ,小径(Banana),400

投稿2020/12/19 04:17

shiketa

総合スコア4054

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問