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

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

詳細はこちら
CSV

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

C#

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

ASP.NET MVC Framework

ASP.NET MVC Frameworkは、MVCパターンをベースとした、マイクロソフトのウェブアプリケーション開発用のフレームワークです。

Q&A

解決済

2回答

654閲覧

csvファイル内の年月データが全ての列で一致しているかの検証をしたい

sad

総合スコア16

CSV

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

C#

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

ASP.NET MVC Framework

ASP.NET MVC Frameworkは、MVCパターンをベースとした、マイクロソフトのウェブアプリケーション開発用のフレームワークです。

0グッド

0クリップ

投稿2020/12/16 08:23

csvファイルを読み込み、一行目の年月から最終行の年月まで全て統一されたデータであればtrue,そうでなければfalseを返すようにしたいです。
csvの中身は

csv

1年月,aコード,bコード,cコード 2202012,100,200,300 3202012,400,500,600 4. 5.

のような形になっています。
一行ずつ読み込み、modelに格納等は出来ているのですが、どのように検証すればいいのかがわかりません。

試したこと

下記C#クラスにて、一行目のcltspt0を使いまわして、二行目からの読み込み時に比較しようとしたのですがwhileの中で繰り返されてしまって常にtrueが出てしまいました。

C#

1 public List<CSVmodel> GetCnt(string csvName) 2 { 3 4 5 if (File.Exists(csvName)) 6 { 7 StreamReader st = new StreamReader(csvName, Encoding.GetEncoding("UTF-8")); 8 List<CSVmodel> list = new List<CSVmodel>(); 9 10 while (!st.EndOfStream) 11 { 12 string clt = st.ReadLine(); 13 string[] cltSpt = clt.Split(','); 14 15 //var std = cltSpt[0]; 16 //if (cltSpt[0] == std) 17 //{ 18 19 var model = new CSVmodel(); 20 21 model.years = int.Parse(cltSpt[0]); //年月 22 model.a = int.Parse(cltSpt[1]); 23 model.b = int.Parse(cltSpt[2]); 24 model.c = int.Parse(cltSpt[3]); 25 model.d = double.Parse(cltSpt[4]); 26 model.e = double.Parse(cltSpt[5]); 27 28 list.Add(model); 29 //} 30 //else 31 //{ 32 // return null; 33 //} 34 } 35 return list; 36 } 37 else 38 { 39 return null; 40 } 41 }

C#

1 public class CSVmodel 2 { 3 public int years { get; set; } 4 public int a { get; set; } 5 public int b { get; set; } 6 public int c { get; set; } 7 public double d { get; set; } 8 public double e { get; set; } 9 }

足りない情報は追記いたします。
よろしくお願いいたします。

環境:
windows10 64bit
visual studio 2019
ASP.NET webアプリケーション MVC
.NET Framework 4.7.2

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2020/12/16 08:37

> 一行目の年月から最終行の年月まで全て統一されたデータであれば 「全て統一されたデータ」とはどういう意味ですか?
sad

2020/12/16 08:40

202012という年月データが一行目にあった場合、二行目以降に一つでも202005等の違う年月が設定されていた場合は統一されていない、という感じです。
退会済みユーザー

退会済みユーザー

2020/12/16 08:50

1 回目の while ループの時だけ cltSpt[0] を何らかの変数に保持しておいて、2 回目以降は変数に保持した値と cltSpt[0] を比較すれば済むのでは?
sad

2020/12/16 08:54

と思ったのですがうまくいかず、、と思っているところに少し閃きが。 whileの中にいれるからダメなのではないか、と当たり前のことを実験してみます。 ありがとうございます。
退会済みユーザー

退会済みユーザー

2020/12/16 08:59

1 回目の while ループの時だけ cltSpt[0] を何らかの変数に保持しておいて・・・と言うことをやってないのでは? var std = cltSpt[0]; は 2 回目のループでは 2 行目の年月になってしまい、その後 if (cltSpt[0] == std) としても意味がないのでは?
退会済みユーザー

退会済みユーザー

2020/12/16 22:58 編集

> csvファイルを読み込み、一行目の年月から最終行の年月まで全て統一されたデータであればtrue,そうでなければfalseを返すようにしたいです。 いまさらながらの質問ですが、質問のコードはそうなってなくて、List<CSVmodel> を返すようになっていて、null か否かの違いになるようです。どうしたいのですか? とにかく、まず List<CSVmodel> を取得して、取得した後で中の「年月」でグループ分けして処理するとかがあるなら、やり方を考え直した方がよさそうですけど。
sad

2020/12/17 00:17

おっしゃる通りで、二週目には二週目の年月で検証されてしまい常にtrueで思考が停止しておりました。 確かに質問の内容だと返り値がbooleanじゃなきゃおかしいですね、、申し訳ございません。 true→Listを返す、false=nullを返すというように解釈していただけると幸いです。
guest

回答2

0

ベストアンサー

while ループにはいる直前に int count = 0; というコードを一行追加し、while ループを抜ける直前に count++; というコードを一行追加すれば、ループの中では count == 0 なら 1 回目、count > 0 なら 2 回目なので、それで処理を分ければ望むことはできると思います。

ただし、質問のコメントに書きましたが、まず List<CSVmodel> を取得して、取得した後で中の「年月」でグループ分けして処理するとかがあるなら、やり方を考え直した方がよさそうですけど。

投稿2020/12/16 23:10

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

sad

2020/12/17 00:22

ありがとうございます。 追記・修正欄でいただいた意見をもとにwhileの前に一行読み込み、年月を変数に保持、以降のループで比較対象とすることで望んだ処理をすることができました。 お手数おかけしました。
guest

0

  1. 最初の1行を読んで日付の部分を変数に保存
  2. 次の1行を読む
  3. このとき、ファイルの最後だったならtrueでリターン
  4. 日付の部分を取り出し、先の変数と比較
  5. 違っていれば、falseでリターン
  6. 2.に繰り返し

でいこう

投稿2020/12/16 09:57

編集2020/12/16 13:12
y_waiwai

総合スコア88040

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

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

sad

2020/12/17 00:25

ありがとうございます。 自分の質問がおかしいばかりに、申し訳ございません。 戻り値がbooleanではなく、、 ですが処理自体はとても参考になりました。ありがとうございます。 本当ならベストアンサーに二名とも選びたいのですが、、 お手数おかけしました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問