Visual Basic の入力ファイル処理について


vs2019でvbコードを作成していましたが、自己解決出来なかったため投稿しました。

「load.csv」ファイルで1行ずつ読込み、ILが1か2によってFPini、Piniに数値を格納させるものです。  
3行分のデーターのため、「NL=3」としています。

「load.txt」に出力させると、下記のとおり1行目のデーターが3回繰り返されて同じ値が格納されてしまいます。  
3行毎のデーターとして違う値が格納されません。

どのようにすれば1行毎に更新されて正しく数値を格納できるでしょうか。  
コードを示しますのでアドバイス頂けますと有難く存じます。

①入力ファイル「load.csv」

[code]

    1   6   0   80  80  0   80  -80
    1   7   0   80  80  0   80  -80
    2   2   100 0   0           
    
[/code]

②出力ファイル「load.txt」

[code]

     1,  6,  0,  80,  80,  0,  80, -80
     1,  6,  0,  80,  80,  0,  80, -80
     1,  6,  0,  80,  80,  0,  80, -80
    
[/code]

③コード

[code]

    Public Pini(600) As Double, FPini(7, 300) As Double
    Public PDATA(3), FPDATA(7)
    
    
            Dim Reader4 As New IO.StreamReader("./load.csv", System.Text.Encoding.GetEncoding("Shift-JIS"))
            Dim dat4() As String                
            Dim Line4 As String = Reader4.ReadLine 
            Dim LineW4 As New IO.StreamWriter("./load.txt", False, System.Text.Encoding.GetEncoding("shift_jis"))
    
            Dim aa4$
    
            dat4 = Line4.Split(",")            
     
            For IM = 1 To NL
    
                IL = dat4(0)    
    
            If IL = 1 Then
        
                IMM = dat4(1)                  
                FPDATA(1) = dat4(2)                  
                FPDATA(2) = dat4(3)                   
                FPDATA(3) = dat4(4)                  
                FPDATA(4) = dat4(5)               
                FPDATA(5) = dat4(6)                   
                FPDATA(6) = dat4(7)                 
    
                For I = 1 To 7
                    FPini(I, IMM) = FPDATA(I)
                Next
    
                aa4$ = Str$(IL) + ", " + Str$(IMM)+ ", " + Str$(FPDATA(1))+ ", " + Str$(FPDATA(2)) + ", " + Str$(FPDATA(3))+ ", " + Str$(FPDATA(4))+ ", " + Str$(FPDATA(5))+ ", " + Str$(FPDATA(6))
    
                    LineW4.WriteLine(aa4$)
    
                 ElseIf IL = 2 Then
    
                INN = dat4(1)                    
                PDATA(1) = dat4(2)                  
                PDATA(2) = dat4(3)                   
                PDATA(3) = dat4(4)                   
    
                For I = 1 To 3
                    II = (INN - 1) * 3 + I
                    Pini(II) = PDATA(I)
                Next
    
                    aa4$ = aa4$ + Str$(IL) + ", " + Str$(INN) + ", " + Str$(PDATA(1)) + ", " + Str$(PDATA(2)) + ", " + Str$(PDATA(3))
    
                    LineW4.WriteLine(aa4$)
    
                End If
    
                 Line4 = Reader4.ReadLine       
    
            Next IM
     
            Reader4.Close()
            LineW4.Close()
    
[/code]




`dat4`の設定・更新がループの始まる前に1回行われているだけで、ループが廻っても更新されないことが原因ですね。

それから`dat4`の更新に使う`Line4`へのcsvファイルからの読み込みが変数の宣言時とループの末尾の2か所に分かれていて、かつ`dat4`の更新からも離れていることが問題を判り難くしているのでは？

こんな風に変更すると良いでしょう。

  1. `Line4`の宣言は宣言だけしてファイルからの読み込みは行わない  
`Dim Line4 As String = Reader4.ReadLine` は `Dim Line4 As String` に変更する

  2. csvファイルからの1行読み込みである`For IM = 1 To NL`ループの末尾の`Line4 = Reader4.ReadLine`はループの先頭に移動する

  3. `dat4`の設定・更新である`dat4 = Line4.Split(",")`はループの外にあったものを上記`Line4 = Reader4.ReadLine`の次の行へ移動する

つまり前後は省略しますが、ループの先頭部分はこんな風になるでしょう。

[code]

            For IM = 1 To NL
    
                Line4 = Reader4.ReadLine
                dat4 = Line4.Split(",")
                IL = dat4(0)
    
                If IL = 1 Then
    
[/code]

