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

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

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

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

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

2回答

824閲覧

CSVの列同士の計算(C#)

hiro24

総合スコア12

CSV

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

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

1クリップ

投稿2018/06/14 15:16

前提・実現したいこと

初めて質問させていただくプログラミング初学者です。

諸事情によりプログラミングを行う必要があり、学習を進めておりました。
そこで、書籍やネットで検索してもどうしても解決できなかったため投稿させていただきました。

以下のようなCSVの<元データ>がありそれを<出力結果>のようにCSV形式で出力できるプログラムを作成したいと考えています。

<元データ>
会員番号, 3月の体重[kg], 4月の体重[kg], 5月の体重[kg]
0001 , 58.4, 58.0, 57.8
0002 , 67.2, 68.3, 67.0
0003 , 63.5, 62.4, 64.0



1000 , 65.4,       66.0, 65.6

<出力結果>
会員番号,3月の体重[kg],4月の体重[kg],5月の体重[kg],3月と4月の差,4月と5月の差
0001, 58.4, 58.0, 57.8, 0.4, 0.2
0002, 67.2, 68.3, 67.0, 1.1, -1.3
0003, 63.5, 62.4, 64.0, -1.1, 1.6



1000, 65.4,     66.0, 65.6, 0.6, -0.4


ここで問題になったのが、①excelでいうところの列同士の計算をCSVで行うこと②計算結果を後ろの列に追加していく方法がわからないことです。

試したこと

using System;
using System.IO;
using System.Text;

static class Data{
string filePath = @"c:~~~\TestData.csv";
}

class LoadCsv {
string[][] loadCSV(string filePath) {
var list = new List<string[]>();
StreamReader reader =
new StreamReader(filePath, System.Text.Encoding.GetEncoding("Shift_JIS"));
while (reader.Peek() >= 0) list.Add(reader.ReadLine().Split(','));
reader.Close();
return list.ToArray();
}
}

class CalculateCsv{
/*
List<T>などを用いる?
*/
}

データ数も今後増えていくため配列ではなくList<T>を使用すると思ったのですが、見当がつかず手詰まりになってしまいました。
自力で解決できないため、アドバイスを頂けないだろうかと思い投稿いたしました。
稚拙なコードや質問で申し訳ございませんが、ご助言いただけないでしょうか。

補足情報(FW/ツールのバージョンなど)

VS2017

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2018/06/15 02:42

コードは ``` と ``` で囲ってください。インデントされて見やすくなりますので。
退会済みユーザー

退会済みユーザー

2018/06/15 02:45

やってることが実用的ではない(6 月のデータが増えたらコードを書き直さねばならない)ような気がするのですが、それは考えなくてよくて、とりあえず今質問に書かれている CSV データのみ考慮すればいいのですか?
guest

回答2

0

各行内に閉じた演算なので、全体を配列なりリスト内に読み込む必要はないですね。

1行を読み込み、1行を出力
をファイル末まで繰り返すすたいるでいけるでしょう。「計算結果をCSVの後ろに追加する」じゃなくて、カンマ、引き算の結果、カンマ、引き算の結果を出力する、と考えてみてください。

投稿2018/06/14 15:27

a_saitoh

総合スコア702

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

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

0

サンプルコードをかきました。
コードは長くなるのでgithubからDLしてください。

ちなみに、
0. 行のデータから個人の体重データを生成するコンストラクタ
0. 個人の体重データをうまく文字化するToString()を定義
というクラスを作りました。

記載のうち、0001の人は体重が減ってもマイナスでなく、引き算の方向がおかしいですが、その辺は勝手に解釈してます。
6月が出てきても、まあ何とかなる感じにはしてますが、csvが"で囲まれたりするとつらいですね。
その辺はcsvを読むライブラリでも使ったほうがよくなると思います。

投稿2018/06/15 07:50

papinianus

総合スコア12705

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問