C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト


(過去ログ 170 を表示中)
■98086 / )  Re[2]: 多項目にてのCSVファイルの書き込みについて
□投稿者/ 魔界の仮面弁士 (3177回)-(2021/09/11(Sat) 20:06:13)
No98082 (ゆい さん) に返信
>   sr.WriteLine(a0(i) & "," & a1(i) & "," & ・・(省略)・・ a499(i) & "," & a500(i)) 

sr という名前だと、
StreamWriter というよりは
StreamReader を連想してしまいそう…。



さて。

a0 や a500 が何を指しているのかが一切説明されていませんが、
それらを別々の変数として分けて管理しているのは何故ですか?
501 列あるからといって、501 個も変数を用意したら管理しにくいですよね。

たとえばそれらの変数が、文字列型の一次元配列だとすれば
それぞれを別々の変数で管理するのではなく、
 Dim a0() As String = {"0行目0列目", "1行目0列目", "2行目0列目"}
 Dim a1() As String = {"0行目1列目", "1行目1列目", "2行目1列目"}
 Dim a2() As String = {"0行目2列目", "1行目2列目", "2行目2列目"}
 Dim a3() As String = {"0行目3列目", "1行目3列目", "2行目3列目"}

まとめて 1 つの配列やコレクションで管理するようにしてみてください。
たとえば、こんな感じの 2 次元配列にすることを考えてみます。
 Dim a(,) As String = {
  {"0行目0列目", "1行目0列目", "2行目0列目"},
  {"0行目1列目", "1行目1列目", "2行目1列目"},
  {"0行目2列目", "1行目2列目", "2行目2列目"},
  {"0行目3列目", "1行目3列目", "2行目3列目"}
}

こうすると、元の
 For rowIndex = 0 To 最大行
  sr.WriteLine(a0(rowIndex) & "," & a1(rowIndex) & "," & a2(rowIndex) & "," & a3(rowIndex)) 
 Next
という処理を
 Dim maxCol As Integer = a.GetUpperBound(0) '最大列番号。今回は 3 が返される
 Dim maxRow As Integer = a.GetUpperBound(1) '最大行番号。今回は 2 が返される。
 For rowIndex = 0 To maxRow
  sr.Write(a(rowIndex, 0)) '最初の列
  For colIndex = 1 To maxCol
   sr.Write("," & a(rowIndex, colIndex)) '2番目以降の列はカンマを伴う
  Next
  sr.WriteLine("") '行末に改行
 Next
のように書き替えられます。


記述量はかなり増えたように見えますが、二次元配列の縦横のサイズが変化したとしても、
maxCol と maxRow の値がそれに連動して変わるので、出力部のコードを一切修正せずに済みます。

また、上記は「a(行, 列)」の並びで管理していますが、
入れ替えて「a(列, 行)」で管理しても構いません。


あるいは出力部をもう少し単純化させたいなら、元のデータをジャグ配列にするのも手です。

 Dim a()() As String = {
  New String() {"0行目0列目", "0行目1列目", "0行目2列目"},
  New String() {"1行目0列目", "1行目1列目", "1行目2列目"},
  New String() {"2行目0列目", "2行目1列目", "2行目2列目"},
  New String() {"3行目0列目", "3行目1列目", "3行目2列目"}
 }

この場合は、二次元配列よりもさらに簡単で
 For Each cols As String() In a
   sr.WriteLine( String.Join( ","c, cols) )
 Next
だけで済みます。
ただしこちらは、「a(行)(列)」での管理が必要であり、a(列)(行) にはできません。


なお「配列」の場合、あらかじめ行数や列数が分かっていないと扱い辛い面があります。
行数が可変な場合は、DataTable や List(Of ) を使って管理することを検討しましょう。


どの方法をとるにしても、沢山のデータをまとめて処理したいのであれば
「それぞれのデータのために、変数を沢山用意する」のではなく、
「沢山のデータを入れるためのコレクション変数を一つだけ用意する」ことが肝心です。
返信 編集キー/


管理者用

- Child Tree -