Imports Microsoft.VisualBasic.FileIO Module Module1 Sub Main() Using MyReader As New TextFieldParser("C:\test.txt" _ , System.Text.Encoding.GetEncoding("Shift_JIS")) '文字コードを指定する。 MyReader.TextFieldType = FieldType.Delimited MyReader.SetDelimiters(",") Dim oRow As String() Dim i As Integer While Not MyReader.EndOfData Try i += 1 Console.WriteLine("レコードNo." + i.ToString) oRow = MyReader.ReadFields() For Each oField As String In oRow Console.WriteLine(oField) Next Console.Write(ControlChars.CrLf) Catch ex As MalformedLineException Console.WriteLine("Line " & ex.Message _ & ControlChars.CrLf & "レコードはそのまま出力されます。") Console.WriteLine(MyReader.ErrorLine & ControlChars.CrLf) End Try End While End Using End Sub End Module
実行結果
レコードNo.1 1 AAA カンマ区切り
レコードNo.2 2 BBB ダブルクォーツで括られている
レコードNo.3 3 CC,C フィールド内にカンマが有る
レコードNo.4 4 D"DD フィールド内にダブルクォーツが有る
レコードNo.5 5 "EEE" フィールドの両端がダブルクォーツ
レコードNo.6 Line 現在の区切り記号を使用して、行 6 を解析できません。 レコードはそのまま出力されます。 6,""FFF,フィールドの左端のダブルクォーツが解析不可
Module Module1 Sub Main() Dim rd As String Dim sr As New System.IO.StreamReader("C:\TEST.FIX" _ , System.Text.Encoding.GetEncoding("Shift_JIS")) '入力フィアル Dim sw As New System.IO.StreamWriter("C:\TEST.CSV" _ , False, System.Text.Encoding.GetEncoding("Shift_JIS")) '出力ファイル Do Until sr.EndOfStream rd = sr.ReadLine sw.WriteLine(Edit_CSV_Field(Mid(rd, 1, 1)) _ + "," + Edit_CSV_Field(Mid(rd, 2, 5)) _ + "," + Edit_CSV_Field(Mid(rd, 7))) Loop sw.Close() sr.Close() End Sub 'フィールドは全て”で括る 'フィールド内の”は””に置換 Private Function Edit_CSV_Field(ByVal strItem As String) As String Return """" + strItem.Replace("""", """""") + """" End Function End Module
親プログラム Module Module1 Sub Main() Dim sf As New System.IO.StreamReader("c:\test.txt", _ System.Text.Encoding.GetEncoding(932)) 'Shift JISを指定 Dim i As Integer = 0 Dim R1 As New R1 Dim R2 As New R2 Do Until sf.EndOfStream Dim sr As String sr = sf.ReadLine() i += 1 R1.Redefines(sr) R2.Redefines(sr) Select Case Mid(sr, 1, 3) Case "R1=" Console.WriteLine(i.ToString + "レコードフォーマット R1") Console.WriteLine(R1.品名) Console.WriteLine(R1.数量) Case "R2=" Console.WriteLine(i.ToString + "レコードフォーマット R2") Console.WriteLine(R2.郵便番号) Console.WriteLine(R2.会社名) Console.WriteLine(R2.住所) End Select Console.WriteLine(ControlChars.CrLf) '改行 Loop sf.Close() End Sub End Module
Module2をプロジェクトに追加します。 Module Module2 'レコードフォーマットR1 Public Structure R1 Public RKEY As String Public 品名 As String Public 数量 As String Public Sub Redefines(ByVal R0 As String) RKEY = Mid(R0, 1, 3) 品名 = Mid(R0, 4, 10) 数量 = Mid(R0, 14, 5) End Sub End Structure 'レコードフォーマットR2 Public Structure R2 Dim RKEY As String Dim 郵便番号 As String Dim 会社名 As String Dim 住所 As String Public Sub Redefines(ByVal R0 As String) RKEY = Mid(R0, 1, 3) 郵便番号 = Mid(R0, 4, 8) 会社名 = Mid(R0, 12, 20) 住所 = Mid(R0, 32, 40) End Sub End Structure End Module
COBOL DATA DIVISION. WORKING-STORAGE SECTION. 01 D1 PIC X(10) VALUE "0123456789". 01 D REDEFINES D1 PIC 9 OCCURS 10. 01 ANS0 PIC S9(5)V99. 01 ANS1 PIC S9(5)V99. 01 ANS2 PIC S9(5)V99. 01 ANS3 PIC S9(5)V99. 01 ANS4 PIC S9(5)V99. 01 ANS5 PIC S9(5)V99. 01 ANS6 PIC S9(5)V99. 01 ANS PIC ----.99. PROCEDURE DIVISION. COMPUTE ANS0 = FUNCTION STANDARD-DEVIATION (D(ALL)). COMPUTE ANS1 = FUNCTION VARIANCE (D(ALL)). COMPUTE ANS2 = FUNCTION MEAN (D(ALL)) . COMPUTE ANS3 = FUNCTION MEDIAN (D(ALL)) . COMPUTE ANS4 = FUNCTION MIDRANGE (D(ALL)) . COMPUTE ANS5 = FUNCTION SUM (D(ALL)) . COMPUTE ANS6 = FUNCTION RANGE (D(ALL)) . MOVE ANS0 TO ANS. DISPLAY "標準偏差 STANDARD-DEVIATION =" ANS . MOVE ANS1 TO ANS. DISPLAY "分散 VARIANCE=" ANS . MOVE ANS2 TO ANS. DISPLAY "平均値 MEAN=" ANS . MOVE ANS3 TO ANS. DISPLAY "メジアン値 MEDIAN=" ANS . MOVE ANS4 TO ANS. DISPLAY "最大最小の平均値 MIDRANGE=" ANS . MOVE ANS5 TO ANS. DISPLAY "合計 SUM=" ANS . MOVE ANS6 TO ANS. DISPLAY "最小値と最大値の差 RANGE=" ANS . STOP RUN.
VB.NET Module Module1 Sub Main() WD() 'テキストファイル書き込み RD() 'テキストファイル読み込み End Sub Private Sub WD() Dim F As New System.IO.StreamWriter("C:\コボラー的VB.NET.txt") For i As Integer = 1 To 10 F.WriteLine(Format(i, "###:" & "コボラー的VB.NET VB.NET2005")) Next F.Close() End Sub Private Sub RD() Dim F As New System.IO.StreamReader("C:\コボラー的VB.NET.txt") Dim R As String Do Until F.EndOfStream R = F.ReadLine Console.WriteLine(R) Loop F.Close() End Sub End Module
文字コードを指定するにはファイル名の後に指定します。指定が無いとUTF-8で処理されます。 読込み Dim F As New System.IO.StreamReader("C:\コボラー的VB.NET.txt", System.Text.Encoding.Default) 書き込み Dim F As New System.IO.StreamReader("C:\コボラー的VB.NET.txt", False, System.Text.Encoding.Default)
System.Text.Encoding.Defaultの代わりに以下のような書き方もできます。 Dim F As New System.IO.StreamReader("C:\コボラー的VB.NET.txt", System.Text.Encoding.GetEncoding("Shift_JIS")) またはコードページを指定する。 Dim F As New System.IO.StreamReader("C:\コボラー的VB.NET.txt", System.Text.Encoding.GetEncoding(932))
マシン日付を取得し季節を判定し画面に表示します。 COBOL WORKING-STORAGE SECTION. 01 YYMMDD PIC X(6). PROCEDURE DIVISION. ACCEPT YYMMDD FROM DATE. IF YYMMDD(3:2) = '12' OR '01' OR '02' DISPLAY YYMMDD(3:2) '月 季節は冬' ELSE IF YYMMDD(3:2) = '03' OR '04' OR '05' DISPLAY YYMMDD(3:2) '月 季節は春' ELSE IF YYMMDD(3:2) = '06' OR '07' OR '08' DISPLAY YYMMDD(3:2) '月 季節は夏' ELSE IF YYMMDD(3:2) = '09' OR '10' OR '11' DISPLAY YYMMDD(3:2) '月 季節は秋' END-IF STOP RUN.
VB.NET 楽をしようと思ってCOBOLのような条件式にしようとすると期待しない結果になってしまいます。 Module Module1 Dim MM As Integer = Now.Month Sub Main() If MM = 12 _ Or MM = 1 _ Or MM = 2 _ Then Console.WriteLine(MM & "月 季節は冬") ElseIf MM = 3 _ Or MM = 4 _ Or MM = 5 _ Then Console.WriteLine(MM & "月 季節は春") ElseIf MM = 6 _ Or MM = 7 _ Or MM = 8 _ Then Console.WriteLine(MM & "月 季節は夏") ElseIf MM = 9 _ Or MM = 10 _ Or MM = 11 _ Then Console.WriteLine(MM & "月 季節は秋") End If End Sub End Module
Module Module1 Structure REC1 <VBFixedString(40)> Public A As String <VBFixedString(11)> Public B As String <VBFixedString(1)> Public C As String <VBFixedString(2)> Public crlf As String End Structure
Structure REC2 <VBFixedString(40)> Public A As String <VBFixedString(11)> Public B As String <VBFixedString(1)> Public C As String <VBFixedString(19)> Public D As String <VBFixedString(2)> Public crlf As String End Structure Dim count As Integer = 0 Sub Main() W() '5件のデータを作成 N() 'レコード数を計数 R() '書き込んだデータを画面表示 U() '別のファイルに転記 End Sub
'レコードの作成 Private Sub W() Dim FileNo As Integer = FileSystem.FreeFile FileSystem.FileOpen(FileNo, "c:\test.txt", OpenMode.Random, , , Len(New REC1()))
Dim WR As New REC1 For Rec_No As Integer = 1 To 5 WR.A = "COBOL的VB.NET" WR.B = Format(Rec_No, "00000000000") WR.C = "x" WR.crlf = ControlChars.CrLf FileSystem.FilePut(FileNo, WR, Rec_No) Next
FileSystem.FileClose(FileNo) 'ファイルを閉じる
End Sub
'レコードの読み込み Private Sub R()
Dim FileNo As Integer = FileSystem.FreeFile FileSystem.FileOpen(FileNo, "c:\test.txt", OpenMode.Random, , , Len(New REC1()))
Dim RR As New REC1 Dim Rec_No As Integer = 1 FileSystem.FileGet(FileNo, RR, Rec_No) Do Until EOF(FileNo) Console.WriteLine(Rec_No & ":") Console.WriteLine(RR.A) Console.WriteLine(RR.B) Console.WriteLine(RR.C) FileSystem.FileGet(FileNo, RR, Rec_No) Rec_No += 1 Loop
FileSystem.FileClose(FileNo) 'ファイルを閉じる
End Sub
'レコードの転記 Private Sub U() Dim FileNoR As Integer = FileSystem.FreeFile FileSystem.FileOpen(FileNoR, "c:\test.txt", OpenMode.Random, , , Len(New REC1())) Dim FileNoU As Integer = FileSystem.FreeFile FileSystem.FileOpen(FileNoU, "c:\testU.txt", OpenMode.Random, , , Len(New REC2()))
Dim R As New REC1 Dim U As New REC2 Dim R_No As Integer = 1 FileSystem.FileGet(FileNoR, R, R_No) Do Until EOF(FileNoR) U.A = R.A U.B = R.B U.C = R.C U.D = Format(Now, "yyyy/MM/dd HH:mm:ss") U.crlf = ControlChars.CrLf FileSystem.FilePut(FileNoU, U, R_No) R_No += 1 FileSystem.FileGet(FileNoR, R, R_No) Loop
'レコードの総数を取得 Private Sub N() If System.IO.File.Exists("c:\test.txt") Then count = FileLen("c:\test.txt") / Len(New REC1()) Console.WriteLine(count.ToString) End If End Sub
COBOL WORKING-STORAGE SECTION. 01 I PIC 9. PROCEDURE DIVISION. PERFORM VARYING I FROM 1 BY 1 UNTIL I > 5 DISPLAY "繰り返し:" I UPON CONSOLE END-PERFORM. STOP RUN.
VB.NET Do...Loop Module Module1 Private j As Integer = 1 Sub Main() Do Until j > 5 Console.WriteLine("繰り返し:" & j) j += 1 Loop End Sub End Module
For...Next Module Module1 Private j As Integer Sub Main() For j = 1 To 5 Console.WriteLine("繰り返し:" & j) Next End Sub End Module
COBOL WORKING-STORAGE SECTION. 01 I PIC 9 VALUE 0. 01 R PIC X(29). PROCEDURE DIVISION. PERFORM A. PERFORM B 3 TIMES. PERFORM C. DISPLAY R. STOP RUN. A SECTION. DISPLAY 'セクションAを実行しました。'. B SECTION. ADD 1 TO I. DISPLAY I ':セクションBを実行しました。'. C SECTION. MOVE 'セクションCの結果' TO R.
VB.NET Aは単純にプロシジャを実行するだけです。 Bは引数をプロシジャに渡して実行します。 Cは結果を親プロシジャに返します。Console.WriteLineの引数の中に入れて一行で記述し楽をしています。 Module Module1 Sub Main() A() B(3) Console.WriteLine(C()) End Sub Private Sub A() Console.WriteLine("プロシジャAを実行しました。") End Sub Private Sub B(ByVal i As Integer) For j As Integer = 1 To i Console.WriteLine(j & ":プロシジャBを実行しました。") Next End Sub Private Function C() As String Return Format(Now, "yyyy/MM/dd HH:mm:ss dddd") End Function End Module
マシンから曜日を取得して画面に表示します。 COBOL WORKING-STORAGE SECTION. 01 W PIC 9. PROCEDURE DIVISION. ACCEPT W FROM DAY-OF-WEEK. EVALUATE TRUE WHEN W = 1 DISPLAY '月曜日' UPON CONSOLE WHEN W = 2 DISPLAY '火曜日' UPON CONSOLE WHEN W = 3 DISPLAY '水曜日' UPON CONSOLE WHEN W = 4 DISPLAY '木曜日' UPON CONSOLE WHEN W = 5 DISPLAY '金曜日' UPON CONSOLE WHEN W = 6 DISPLAY '土曜日' UPON CONSOLE WHEN OTHER * 7は日曜日です。 DISPLAY '日曜日' UPON CONSOLE END-EVALUATE. STOP RUN.
曜日を編集するには「:」を使って1行で書こう。
VB.NET Module Module1 Dim W As DayOfWeek Sub Main() Select Case W Case 0 Console.WriteLine("日曜日") Case 1 Console.WriteLine("月曜日") Case 2 Console.WriteLine("火曜日") Case 3 Console.WriteLine("水曜日") Case 4 Console.WriteLine("木曜日") Case 5 Console.WriteLine("金曜日") Case 6 Console.WriteLine("土曜日") End Select End Sub End Module
COBOL 01 HH PIC X(3) VALUE '24'. 01 MM PIC X(3) VALUE '59'. 01 A PIC X(7).
STRING HH ': ' MM DELIMITED BY SIZE INTO A 結果:A='24 :59' 入力文字列の末尾空白はそのまま STRING HH ':' MM DELIMITED BY SPACE INTO A 結果:A='24:59 ' 入力文字列の末尾空白を削除 注)文字列データの末尾には空白が充填されます。
VB.NET Dim HH As String = "24" Dim MM As String = "59" Dim A As String
A = HH & ":" & MM 結果:A="24:59"
注)文字列データは可変長です。 末尾空白の削除 Dim A As String = "24 " Dim B As String
COBOL DATA DIVISION. WORKING-STORAGE SECTION. 01 A PIC 9(5)V9. 01 B PIC 9(5)V9 VALUE 100. PROCEDURE DIVISION. COMPUTE A = B / 0 ON SIZE ERROR MOVE 0 TO A . DISPLAY A UPON CONSOLE. STOP RUN.
VB.NET Module Module1 Sub Main() Dim A As Decimal Dim B As Decimal = 100 Try A = B / 0 Catch ex As Exception A = 0 End Try Console.WriteLine(A) End Sub End Module
COBOL DATA DIVISION. WORKING-STORAGE SECTION. 01 A PIC X(20) VALUE 'ABC DEF 12 zy'. 01 B PIC X(3) OCCURS 5. 01 I PIC 9(2). PROCEDURE DIVISION. UNSTRING A DELIMITED BY SPACE INTO B(1) B(2) B(3) B(4) . PERFORM VARYING I FROM 1 BY 1 UNTIL I > 4 DISPLAY B(I) UPON CONSOLE END-PERFORM. STOP RUN.
VB.NET Module Module1 Dim A As String = "ABC DEF 12 zy" Dim B() As String Sub Main() B = Split(A, " ") For Each C As String In B Console.WriteLine(C) Next End Sub End Module
Module Module1 Dim A1 As String = "1234567890" Dim A2 As String = "1234567.890" Dim A3 As String = "-1234567890" Dim A4 As String = ".1234567890-" Dim B1 As String = "1234567.890+" Dim B2 As String = "一二三四五六七八九十" Dim B3 As String = "壱" Dim B4 As String = "①" Dim B5 As String = "ⅠⅡ" Sub Main() A(A1) A(A2) A(A3) A(A4) A(B1) A(B2) A(B3) A(B4) A(B5) End Sub Private Sub A(ByVal StrA As String) If IsNumeric(StrA) Then Console.WriteLine(StrA & "は数値です。") Else Console.WriteLine(StrA & "は非数値です。") End If End Sub End Module
COBOL DATA DIVISION. WORKING-STORAGE SECTION. 01 A PIC 9(2) VALUE 7. 01 B PIC 9(2). PROCEDURE DIVISION. COMPUTE B ROUNDED = A / 2. DISPLAY B UPON CONSOLE. STOP RUN. #結果 B=4
VB.NET COBOLと同じROUND命令がありますが四捨五入の機能は有りません。 Format関数で文字編集後Decimalデータに変換しています。 Module Module1 Sub Main() Dim A As Decimal = 7 Dim B As Decimal B = Convert.ToDecimal(Format(A / 2, "#0")) Console.WriteLine(B) End Sub End Module
VB.NETのソースコード Imports System.Configuration.ConfigurationManager Module Module1 Sub Main() Dim strFOLDER As String = AppSettings("FoldName") End Sub End Module
COBOL DATA DIVISION. WORKING-STORAGE SECTION. 01 DATA1. 02 PIC X(5) VALUE '01 冬'. 02 PIC X(5) VALUE '02 冬'. 02 PIC X(5) VALUE '03 春'. 02 PIC X(5) VALUE '04 春'. 02 PIC X(5) VALUE '05 春'. 02 PIC X(5) VALUE '06 夏'. 02 PIC X(5) VALUE '07 夏'. 02 PIC X(5) VALUE '08 夏'. 02 PIC X(5) VALUE '09 秋'. 02 PIC X(5) VALUE '10 秋'. 02 PIC X(5) VALUE '11 秋'. 02 PIC X(5) VALUE '12 冬'. 01 REDEFINES DATA1 . 02 A OCCURS 12 INDEXED I. 03 A1 PIC 99. 03 PIC X. 03 A2 PIC XX. PROCEDURE DIVISION. SET I TO 1. SEARCH A WHEN A1(I) = '09' DISPLAY A2(I) UPON CONSOLE END-SEARCH. STOP RUN.
VB.NET Hashtableにデータを組み込み表引きを実行します。
Module Module1 Public A As New Hashtable Public Sub InitializeA() A.Add(1, "冬") A.Add(2, "冬") A.Add(3, "春") A.Add(4, "春") A.Add(5, "春") A.Add(6, "夏") A.Add(7, "夏") A.Add(8, "夏") A.Add(9, "秋") A.Add(10, "秋") A.Add(11, "秋") A.Add(12, "冬") End Sub Sub Main() InitializeA() Console.WriteLine(A(9)) End Sub End Module
COBOL データ名Aに引数が入ります。 DATA DIVISION. WORKING-STORAGE SECTION. 01 A PIC X(80). PROCEDURE DIVISION. ACCEPT A FROM COMMAND-LINE. DISPLAY A UPON CONSOLE. STOP RUN.
VB.NET 取得した引数は空白文字を区切りにして配列に充填されます。配列(0)には実行プログラム名が入ります。 Module Module1 Sub Main() 'コマンドラインを配列で取得する Dim aryA() As String = System.Environment.GetCommandLineArgs() For Each strA As String In aryA Console.WriteLine(strA) Next End Sub End Module 実行例 プログラムC:\MyProg.exeを実行 C:\>MyProg.exe Arg C:\>C:\MyProg.exe↓ C:\>MyProg.exe Arg
データベースの処理をするなら以下の二つのアプリケーションがおススメです。こちらも使用料は無料です。 SQL Server 2005 Express Edition Microsoft SQL Server Management Studio Express 制限が幾つか有りますがテストするには十分な機能を持っています。
COBOL DATA DIVISION. WORKING-STORAGE SECTION. 01 A PIC X(26) VALUE 'ABCDEFGHIJKLMNOPORSTUVWXYZ'. 01 B PIC X(3). PROCEDURE DIVISION. IF A(25:1) = 'Y' THEN STRING A(25:1) A(5:1) A(19:1) DELIMITED BY SIZE INTO B DISPLAY B UPON CONSOLE MOVE A(4:3) TO B DISPLAY B UPON CONSOLE END-IF . STOP RUN.
VB.NET(Mid関数) Module Module1 Dim A As String = "ABCDEFGHIJKLMNOPORSTUVWXYZ" Dim B As String Sub Main() If Mid(A, 25, 1) = "Y" Then B = Mid(A, 25, 1) & Mid(A, 5, 1) & Mid(A, 19, 1) Console.WriteLine(B) Console.WriteLine(Mid(A, 4, 3)) End If End Sub End Module
VB.NET(Substringメソッド)
Module Module1 Sub Main() Dim A As String = "ABCDEFGHIJKLMNOPORSTUVWXYZ" Dim B As String If A.Substring(24, 1) = "Y" Then B = A.Substring(24, 1) & A.Substring(4, 1) & A.Substring(18, 1) Console.WriteLine(B) Console.WriteLine(A.Substring(3, 3)) End If End Sub End Module