掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
2次元配列の宣言 (ID:143330)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
ジャグ配列のままだと、何か都合が悪いのでしょうか? 二次元配列だと、行数や列数を変化させる場合に手間がかかりそうですし、 特に理由がなければ、今のコードのままでも問題ないように思います。 格納済みの要素にアクセスするなら、 「boxDimArray(rowIndex, colIndex)」が 「jaggedArray(rowIndex)(colIndex)」 という表記に変わるだけですし、行/列番号を指定して扱う分には大差はないかと。 > Function関数など何かございますでしょうか。 COM Interop を伴うのでお奨めはしませんが(個人的には非推奨)、一応、 ADODB.Recordset の GetRows メソッドが二次元配列を返すようになっています。 > CSVファイルから読み込むものなんですけど。 二次元配列に格納するには、csvの行数/列数をあらかじめ調べねばならないため、 いったん DataTable やジャグ配列に蓄えて、あとで変換する実装が多いかと思います。 (列数は事前に分かることもあるが、行数は可変にせざるを得ない) 列数があらかじめ分かっている場合は、行と列の順序を Dim box(列数, 行数) As String の 順にしておき、行数に応じて ReDim Preserve ステートメントで調整する実装もありますが、 それなら、ジャグ配列から変換した方が楽でしょうね。 > Dim strArray(,) As String どうしても二次元配列が必要ということであれば…。 既に完成しているジャグ配列から、インデックスの最大値(あるいは要素数)を調べる方法は分かりますか? それができれば、そこから二次元配列に並び替えるのは容易ですよね。 インデックスの最大値は、UBound 関数または GetUpperBound メソッドで調べられます。 要素数なら、Length プロパティです。 '行番号/列番号の最大値を調べる。 'CSV の列数が事前に分かっているなら、colMaxIndex の方は固定値でも OK。 Dim rowMaxIndex As Integer = jaggedArray.GetUpperBound(0) Dim colMaxIndex As Integer = Aggregate row In jaggedArray Into Max(row.GetUpperBound(0)) '二次元配列として、必要な行数/列数を確保する Dim boxDimArray(rowMaxIndex, colMaxIndex) As String 'ジャグ配列から二次元配列に転記する For rowIndex As Integer = 0 To rowMaxIndex For colIndex As Integer = 0 To colMaxIndex boxDimArray(rowIndex, colIndex) = jaggedArray(rowIndex)(colIndex) Next Next '========================================================= あるいは、ジャグ配列にしてから変換するのではなく、 Split や TextFieldParser で切り出すたびに、 二次元配列に格納していっても良いかと。 'csvファイルを、行ごとに区切った1次元配列にする Dim rows() As String = System.IO.File.ReadAllLines( "C:\temp\test.csv", System.Text.Encoding.GetEncoding("Shift_JIS")) '空行を読み捨てる。 rows = rows.Where(Function(row) Not String.IsNullOrWhiteSpace(row)).ToArray() '行数を調べる Dim rowMaxIndex As Integer = rows.GetUpperBound(0) '先頭行の「,」の数から、列数を調べる Dim cols() As String = rows.First().Split(",") Dim colMaxIndex As Integer = cols.GetUpperBound(0) '行数/列数分の二次元配列を確保する Dim strArray(rowMaxIndex, colMaxIndex) As String '確保した二次元配列に、csvデータを格納していく For rowIndex As Integer = 0 To rowMaxIndex cols = rows(rowIndex).Split(",") For colIndex As Integer = 0 To colMaxIndex strArray(rowIndex, colIndex) = cols(colIndex) Next Next
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2020 Takeshi Okamoto All Rights Reserved.