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

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

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

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

C#

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

Q&A

解決済

4回答

261閲覧

CSVとstring[][]型の変換に向くクラス設計の方法は?

cancat

総合スコア313

CSV

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

C#

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

0グッド

1クリップ

投稿2017/10/10 01:34

こんにちは。
Windows10でC#のアプリケーションを開発しています。
Visual Studio 2017 Proを使っています。

###前提・実現したいこと
\r\nと\tで、行とセルに分かれているテキストを構築し編集し、最終的にはstring[][]型にコンバートしたいです。
そのときの型あるいはクラスを何にすればよいか悩んでいます。

###試したこと
string[][]は項目の追加が難しいので、List<List<string>>を使ってみました。

###該当のソースコード

C#

1List<List<string>> lines = new List<List<string>>(); 2foreach(List<string> line in lines){ 3 line.Add("A"); 4 line.Add("B"); 5 line.Add("C"); 6} 7string[][] resultlines = lines.ToArray();

みたいなかんじ。

これでlinesには複数行があり、lineはcellsであるわけですが、

###発生している問題・エラーメッセージ

C#

1List<List<string>> lines = new List<List<string>>(); 2foreach(List<string> line in lines){ 3 foreach(string cell in line){ 4 if (cell == "A") cell = "D"; 5 } 6}

みたいに編集すると、
foreach(string cell in line)のところ、lineは単数なのに、実は複数であるところにネーミングの違和感を感じます。

C#

1List<List<string>> lines = new List<List<string>>(); 2foreach(List<string> cells in lines){ 3 foreach(string cell in cells){ 4 if (cell == "A") cell = "D"; 5 } 6}

としても、linesのしたにさらにcellsと複数形が来るのが微妙で。

そもそも
List<List<string>>が複雑ですし。
そのくらいならクラス作ったほうがいいでしょうか?
というのが相談です。

###補足情報(言語/FW/ツール等のバージョンなど)
Microsoft Visual Studio Pro 2017
Microsoft .NET Framework
Version 4.6.01586

です。
よろしくお願いします。

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

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

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

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

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

guest

回答4

0

ベストアンサー

こんな感じではどうでしょう?

c#

1List<List<string>> table = new List<List<string>>(); 2foreach(List<string> row in table){ 3 foreach(string cell in row){ 4 if (cell == "A") cell = "D"; 5 } 6}

自分なら質問の趣旨から外れますが
1行に対するクラスを作って、そのインスタンスをリストに
持たせる方法を使います。配列は出来るだけ使わない方向にします。

投稿2017/10/10 02:28

編集2017/10/10 02:36
kikukiku

総合スコア514

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

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

cancat

2017/10/10 07:37

ありがとうございます。 なるほど。そもそも複数形を使わず、table-row-cellと展開すれば、意味的に階層化できるわけですね。 なるほど。 1行のクラスを作ってそれでリストですね。それはありかも。 List<Line> table = new List<Line>(); で Class Line { public List<string> cells = new List<string>(); } って感じ?
guest

0

Lineに対する、ちょっと面倒な処理をするなら、ノータイムで、Lineクラスを作る話かと。
データと手続きを一緒のところでやる、がオブジェクト指向の基本的な考え方なので。

もちろん、データと手続きがバラバラでもプログラムは作れますけどね。

投稿2017/10/10 04:44

kiichi54321

総合スコア1984

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

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

cancat

2017/10/10 07:29

やっぱクラスですね!
guest

0

同じように行と列をを持つSystem.Data.DataTableを参考にしてはどうでしょうか?
DataTableの場合、全セルの値を利用する場合は以下のようなコードになると思います。

c#

1foreach (DataRow row in dataTable.Rows) { 2 foreach (DataColumn column in dataTable.Columns) { 3 // row[column] を利用 4 } 5}

投稿2017/10/10 05:57

ku__ra__ge

総合スコア4524

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

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

cancat

2017/10/10 07:29

ありがとうございます。 あー。これも考えたのですが、これだとrowとdataTable.Columnsが直接関係なさげに見えて、悩んじゃいました。
guest

0

foreach(string cell in line)のところ、lineは単数なのに、実は複数であるところにネーミングの違和感を感じます。

あるひとつの入れ物(line)に複数の物(cell)が入っているだけなので何も問題ないと思います。

そもそも

List<List<string>>が複雑ですし。
そのくらいならクラス作ったほうがいいでしょうか?
というのが相談です。

List<List<string>>がそんなに複雑かはさておき、
多くの人がやりたがりそうなものは、大抵すでに誰かが作ってます。
CSVの取扱いもすでにライブラリがあります。

たとえば、csvHelper
これを使うか、どうしても自分で作りたい事情があればこれを参考にすればいいと思います。


ついでに:foreach内で列挙変数に代入できません。

C#

1List<List<string>> lines = new List<List<string>>(); 2foreach(List<string> cells in lines){ 3 foreach(string cell in cells){ 4 if (cell == "A") cell = "D"; // 不可 5 } 6}

投稿2017/10/10 02:35

ozwk

総合スコア13512

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

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

cancat

2017/10/10 07:34

ありがとうございます。 自分で作りたくはないのですが、作るのも好きですけど。 List<List<string>>、複雑じゃないですか? >>のあたりで、ちょっとおしりがくすぐったくなっちゃうんですけど。 わたしの頭がついていっていないだけです。そのうちなれるかな。 列挙変数は代入できませんでしたね。そうでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問