VBAでシフトJISファイルをEBCDICに変換する必要があり、
ネットを探すと「VBS/シフトJISファイルをEBCDICに変換する」ていうページがあったので、
それを参考にVBAにしてみた。
VBS/シフトJISファイルをEBCDICに変換する http://wikis.sakura.ne.jp/tipi/?VBS/%A5%B7%A5%D5%A5%C8JIS%A5%D5%A5%A1%A5%A4%A5%EB%A4%F2EBCDIC%A4%CB%CA%D1%B4%B9%A4%B9%A4%EB
読み込むファイルは固定長のシフトJISの1バイト文字だけのファイル。
その内容をEBCDICにして改行コードを削除して出力します。
Sub test()
'【参照設定】Microsoft ActiveX Data Objects 6.1 Library にすること
Dim oFileStream As ADODB.Stream
Dim b_data() As Byte
'ファイル名
input_file = "data1.TXT"
output_file = "data2.TXT"
'変換テーブル読み込み
xlatTable = ASCII_To_EBCDIC_Table()
On Error GoTo Err
'入力ファイルのオープン
Set oFileStream1 = New ADODB.Stream 'ADODB.Stream生成
oFileStream1.Type = adTypeText 'Textモード
oFileStream1.Charset = "Shift_JIS" '文字コード(Shift_JIS,UTF-8 ,Unicodeなど)
oFileStream1.Open 'Streamのオープン
oFileStream1.LoadFromFile (input_file)
'出力ファイルのオープン
Set oFileStream2 = New ADODB.Stream 'ADODB.Stream生成
oFileStream2.Type = adTypeBinary 'Binary モード
oFileStream2.Open 'Streamのオープン
'ファイルの終りまでループ
Do While Not (oFileStream1.EOS)
'1行読み込み(readText(adReadAll):すべて読み込み)
x_line = oFileStream1.ReadText(adReadLine)
ReDim b_data(Len(x_line) - 1) As Byte
For i = 0 To Len(x_line) - 1
codeConv = Mid(xlatTable, (Asc(Mid(x_line, i + 1, 1)) * 2) + 1, 2)
'Debug.Print i & ":" & Hex(Asc(Mid(x_line, i + 1, 1))) & " " & codeConv & " " & Val("&H" + codeConv)
b_data(i) = Val("&H" + codeConv)
Next
oFileStream2.Write b_data '内容を書き込む'
Loop
oFileStream1.Close
Set oFileStream1 = Nothing
oFileStream2.SaveToFile output_file, 2 '2:adSaveCreateOverWrite
oFileStream2.Close
Set oFileStream = Nothing
Exit Sub
Err:
Set oFileStream = Nothing
'エラー内容
MsgBox (Err.Description)
End Sub
Function ASCII_To_EBCDIC_Table()
'
' Returns the following table as a string for use by the Translate
' function to translate an ASCII-ISO/ANSI string to an EBCDIC string.
'
' (Hitachi EBCDIK)
' 0 1 2 3 4 5 6 7 8 9 A B C D E F
' 0 00 01 02 03 37 2D 2E 2F 16 05 15 0B 0C 0D 0E 0F :016 :----------------:
' 1 10 11 12 13 3C 3D 32 26 18 19 3F 27 1C 1D 1E 1F :032 :----------------:
' 2 40 4F 7F 7B E0 6C 50 7D 4D 5D 5C 4E 6B 60 4B 61 :048 : !"#$%&'()*+,-./:
' 3 F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 7A 5E 4C 7E 6E 6F :064 :0123456789:;<=>?:
' 4 7C C1 C2 C3 C4 C5 C6 C7 C8 C9 D1 D2 D3 D4 D5 D6 :080 :@ABCDEFGHIJKLMNO:
' 5 D7 D8 D9 E2 E3 E4 E5 E6 E7 E8 E9 4A 5B 5A 5F 6D :096 :PQRSTUVWXYZ[\]^_:
' 6 79 59 62 63 64 65 66 67 68 69 70 71 72 73 74 75 :112 :~abcdefghijklmno:
' 7 76 77 78 80 8B 9B 9C A0 AB B0 B1 C0 6A D0 A1 07 :128 :pqrstuvwxyz{|}~ :
' 8 20 21 22 23 24 25 06 17 28 29 2A 2B 2C 09 0A 1B :133 :----------------:
' 9 30 31 1A 33 34 35 36 08 38 39 3A 3B 04 14 3E E1 :160 :----------------:
' A 57 41 42 43 44 45 46 47 48 49 51 52 53 54 55 56 :176 : 。「」、・ヲァィゥェォャュョッ:
' B 58 81 82 83 84 85 86 87 88 89 8A 8C 8D 8E 8F 90 :192 :ーアイウエオカキクケコサシスセソ:
' C 91 92 93 94 95 96 97 98 99 9A 9D 9E 9F A2 A3 A4 :208 :タチツテトナニヌネノハヒフヘホマ:
' D A5 A6 A7 A8 A9 AA AC AD AE AF BA BB BC BD BE BF :224 :ミムメモヤユヨラリルレロワン゙゚:
' E B2 B3 B4 B5 B6 B7 B8 B9 CA CB CC CD CE CF DA DB :240 :----------------:
' F DC DD DE DF EA EB EC ED EE EF FA FB FC FD FE FF :256 :----------------:
'
' ASCII_To_EBCDIC_Table = _
' "00010203372D2E2F1605150B0C0D0E0F101112133C3D322618193F271C1D1E1F" & _
' "404F7F7BE06C507D4D5D5C4E6B604B61F0F1F2F3F4F5F6F7F8F97A5E4C7E6E6F" & _
' "7CC1C2C3C4C5C6C7C8C9D1D2D3D4D5D6D7D8D9E2E3E4E5E6E7E8E94A5B5A5F6D" & _
' "79596263646566676869707172737475767778808B9B9CA0ABB0B1C06AD0A107" & _
' "202122232425061728292A2B2C090A1B30311A333435360838393A3B04143EE1" & _
' "57414243444546474849515253545556588182838485868788898A8C8D8E8F90" & _
' "9192939495969798999A9D9E9FA2A3A4A5A6A7A8A9AAACADAEAFBABBBCBDBEBF" & _
' "B2B3B4B5B6B7B8B9CACBCCCDCECFDADBDCDDDEDFEAEBECEDEEEFFAFBFCFDFEFF"
'(Fujitsu EBCDIC)
' 0 1 2 3 4 5 6 7 8 9 A B C D E F
' 0 00 01 02 03 37 2D 2E 2F 16 05 15 0B 0C 0D 0E 0F :016 :----------------:
' 1 10 11 12 13 3C 3D 32 26 18 19 3F 27 1C 1D 1E 1F :032 :----------------:
' 2 40 4F 7F 7B E0 6C B6 B7 4D 5D 5C 4E 6B 60 4B 61 :048 : !"#$%&'()*+,-./:
' 3 F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 7A 5E 4C 7E 6E 6F :064 :0123456789:;<=>?:
' 4 7C C1 C2 C3 C4 C5 C6 C7 C8 C9 D1 D2 D3 D4 D5 D6 :080 :@ABCDEFGHIJKLMNO:
' 5 D7 D8 D9 E2 E3 E4 E5 E6 E7 E8 E9 4A 5B 5A 5F 6D :096 :PQRSTUVWXYZ[\]^_:
' 6 79 7D B4 63 64 65 66 67 68 69 70 71 72 73 74 75 :112 :~abcdefghijklmno:
' 7 76 77 78 50 8B 9B 9C A0 AB B0 B1 C0 6A D0 A1 07 :128 :pqrstuvwxyz{|}~ :
' 8 20 21 22 23 24 25 06 17 28 29 2A 2B 2C 09 0A 1B :133 :----------------:
' 9 30 31 1A 33 34 35 36 08 38 39 3A 3B 04 14 3E E1 :160 :----------------:
' A 57 41 42 43 44 45 46 47 48 49 51 52 53 54 55 56 :176 : 。「」、・ヲァィゥェォャュョッ:
' B 58 81 82 83 84 85 86 87 88 89 8A 8C 8D 8E 8F 90 :192 :ーアイウエオカキクケコサシスセソ:
' C 91 92 93 94 95 96 97 98 99 9A 9D 9E 9F A2 A3 A4 :208 :タチツテトナニヌネノハヒフヘホマ:
' D A5 A6 A7 A8 A9 AA AC AD AE AF BA BB BC BD BE BF :224 :ミムメモヤユヨラリルレロワン゙゚:
' E B2 B3 B4 B5 B6 B7 B8 B9 CA CB CC CD CE CF DA DB :240 :----------------:
' F DC DD DE DF EA EB EC ED EE EF FA FB FC FD FE FF :256 :----------------:
'
' 0 1 2 3 4 5 6 7 8 9 A B C D E F 0 1 2 3 4 5 6 7 8 9 A B C D E F
ASCII_To_EBCDIC_Table = _
"00010203372D2E2F1605150B0C0D0E0F101112133C3D322618193F271C1D1E1F" & _
"404F7F7BE06CB6B74D5D5C4E6B604B61F0F1F2F3F4F5F6F7F8F97A5E4C7E6E6F" & _
"7CC1C2C3C4C5C6C7C8C9D1D2D3D4D5D6D7D8D9E2E3E4E5E6E7E8E94A5B5A5F6D" & _
"797DB463646566676869707172737475767778508B9B9CA0ABB0B1C06AD0A107" & _
"202122232425061728292A2B2C090A1B30311A333435360838393A3B04143EE1" & _
"57414243444546474849515253545556588182838485868788898A8C8D8E8F90" & _
"9192939495969798999A9D9E9FA2A3A4A5A6A7A8A9AAACADAEAFBABBBCBDBEBF" & _
"B2B3B4B5B6B7B8B9CACBCCCDCECFDADBDCDDDEDFEAEBECEDEEEFFAFBFCFDFEFF"
'相違点
' (Hitachi) (Fujitsu)
' & 50 B6
' ' 7D B7
' a 59 7D
' b 62 B4
' s 80 50
End Function
2件のコメント
佐々木隆司 · 2023年10月2日 6:34 PM
VBAでEBCDICをシフトJISファイルに変換することは可能でしょうか。
よろしくお願いいたします。
kanri · 2023年10月10日 1:00 PM
可能です。これの逆テーブルを作ればいい。
ネットにもどっかにあるはず。