一次元配列を二次元配列に代入していくプログラム

タグの編集
投稿者 珪藻  (社会人) 投稿日時 2009/7/17 00:17:31
Imports System
Imports Microsoft.VisualBasic.FileIO

Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        '項目書込み
        Dim Writer0 As New IO.StreamWriter("C:\VBTestY.txt")
        Writer0.WriteLine(",生産冷却水,生産冷却水,生産冷却水,生産冷却水,生産冷却水,生産冷却水,冷却塔1,冷却塔1,冷却塔2,冷却塔2" + vbCrLf + ",熱交出口温度,送水圧力,送水流量(瞬時),送水流量(積算),導電率,補給水量,往温度,還温度,往温度,還温度")
        Writer0.Close()
        '/項目書込み

        Dim arr2(50, 20) As String
        Dim tr, sr, st, sk, sh, test As String
        Dim a, s, k, i As Integer
        s = 0
        tr = "01"
        sr = "00"
        test = "[INFOMATION]"
        test = "Created=2009/06/26 09:58:53 Complete=Y Modify=N"

        For i = 0 To 11

            If (s = 0) Then
                tr = "01"
                k = 46
            ElseIf (s = 1) Then
                tr = "02"
                k = 43
            ElseIf (s = 2) Then
                tr = "03"
                k = 46
            ElseIf (s = 3) Then
                tr = "04"
                k = 45
            ElseIf (s = 4) Then
                tr = "05"
                k = 46
            ElseIf (s = 5) Then
                tr = "06"
                k = 45
            ElseIf (s = 6) Then
                tr = "07"
                k = 46
            ElseIf (s = 7) Then
                tr = "08"
                k = 46
            ElseIf (s = 8) Then
                tr = "09"
                k = 45
            ElseIf (s = 9) Then
                tr = "10"
                k = 46
            ElseIf (s = 10) Then
                tr = "11"
                k = 45
            ElseIf (s = 11) Then
                tr = "12"
                k = 46
            End If

            '読み込み
            Dim Sta As String = "C:\REP2009" + tr + ".txt"
            Dim Reader As New IO.StreamReader(Sta)
            s = s + 1

            a = 0
            Do While a < k
                sr = Reader.ReadLine()

                '配列置換
                Dim arr1() As String = Split(sr, ",")
                sh = arr1(a)
                arr2(i, a) = sh
                '/配列置換

                a = a + 1
            Loop

            Reader.Close()
            '/読み込み

            '置き換え
            st = sr.Replace("AVERAGE", tr)
            '/置き換え

            '書込み
            Dim textFile As String = "C:\VBTestY.txt"
            '文字コード(ここでは、Shift JIS)
            Dim enc As System.Text.Encoding = System.Text.Encoding.GetEncoding(932)
            '書き込む文字列
            Dim str As String = st + vbCrLf

            'textFileの末尾にstrを書き加える
            System.IO.File.AppendAllText(textFile, str, enc)
            '/書込み

        Next i


あるカンマ区切りになっているテキストファイル(複数)の任意の行を1次元配列で読み込みし、
それを二次元配列に代入していくプログラムなのですが、Do While文の一周目はうまく行くのですが、
二週目に

sh = arr1(a)

の部分で

IndexOutOfRangeExceptionはハンドルされませんでした。

というエラーが発生しまして、色々調べてるのですが改善されずもう3日目・・・
どなたかアドバイス下さい。
投稿者 るしぇ  (社会人) 投稿日時 2009/7/17 01:20:23
> 色々調べてるのですが改善されず
何を調べてるのかよく分からないんだけど、エラーが起きてる時の
arr1 の中身を確認したら勝手に決めてる k よりデータが少ないと
いうだけではないの?
その場合はどうするのか自分で好きなように決めれば良いのでは?
投稿者 珪藻  (社会人) 投稿日時 2009/7/17 01:50:17
早速のご回答ありがとうございます。

kは読み込もうとしているテキストファイル内の読み込ませたい行を指定するために定めた値なんで、
ループ条件のaとしか関わりが無いかと思うのですがどうなんでしょうか?
ちなみにエラーが出ているときのarr1の中身は、

"Created=2009/06/24 19:03:16 Complete=Y Modify=N"

となっております。
投稿者 るしぇ  (社会人) 投稿日時 2009/7/17 02:12:52
>kは読み込もうとしているテキストファイル内の読み込ませたい行を
そのようなプログラムは書かれていません。

>            Do While a < k
a が k より小さい時は
>                a = a + 1
a を増やして行くのだから、a がどこまで増えるのかを
決めているのは k です。

そして1行ずつテキストファイルのデータを読み込み
全ての行のデータを格納しようとするプログラムです。

k は月の日数に15を足した数っぽいので毎日記録した
実際のデータの行で無いとループをまわすこと自体
NGなのでは?

>ちなみにエラーが出ているときのarr1の中身は、
>"Created=2009/06/24 19:03:16 Complete=Y Modify=N"
その行を分割して配列に格納しようとしているのでしょう?
意図をエスパーすると、それは読み飛ばすべき行なのでしょう?

# どうでもいいけど。。2月は28日固定なんだね。。。
投稿者 珪藻  (社会人) 投稿日時 2009/7/17 02:56:31
大分混乱しているようで変な事言って申し訳ないです。
Do Whileループは特定の行だけを書き込むためにReadLineをもちいて
行を送っていくものでした。
一次元配列内のデータを二次元配列に持っていくときに
一度変数に格納してから行くようにしようとしていたのですが、
aではなくほかの変数を使ってやらねばならなかったようです。

おかげさまでようやく進みそうです。
ありがとうございました。