|
■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 ) を使って管理することを検討しましょう。
どの方法をとるにしても、沢山のデータをまとめて処理したいのであれば 「それぞれのデータのために、変数を沢山用意する」のではなく、 「沢山のデータを入れるためのコレクション変数を一つだけ用意する」ことが肝心です。
|