前提・ 実現したいこと
【実現したいこと一覧】
①全角文字項目は値の後ろに、全角スペース埋めをしたい
②テキストファイルに1レコード書き込みごとに改行したい
③半角文字項目は値の後ろに、半角スペース埋めをしたい(すでに実装済み)
④ダブルコーテーションがあったら、削除してテキストファイルに書き込みたい(すでに実装済み?)
⑤数値項目は値の前に、0埋めをしたい(すでに実装済み)
【変換前CSVファイル】※全角スペースは□で表現しています。 B,2023,1,22,1,1234567,12345,"山田たろう□□□□□□□□□□□" B,2023,1,22,1,123456,1234,"佐藤けん□□□□"
上記のようなCSVファイルをJavaで読み込み、テキストファイルに変換するプログラムを作っています。
【変換後テキストファイル】※全角スペースは□で表現しています。 B2023012211234567000012345山田たろう□□□□□□□□□□□ B2023012210123456000001234佐藤けん□□□□□□□□□□□□
↓こちらの質問を参考にソースを作成しております。
https://teratail.com/questions/329018
それぞれ(1バイト,4バイト,2バイト,2バイト,1バイト,7バイト,9バイト,32バイト(全角16文字))の固定長で変換したいと思っています。
データ例(全角文字項目):
変換前:"佐藤けん□□□□"
変換後:佐藤けん□□□□□□□□□□□□(32バイト)
※全角スペースは□で表現しています。また、半角全角混合のパターンは無いと想定しています。
発生している問題・エラーメッセージ
csvデータ1レコード目(山田たろうのデータ)は出力できるのですが、2レコード目(佐藤けんのデータ)が出力できません。
二つのデータ間で何が違くて出力結果に差があるのかが知りたいです。
また、改行をするよう「16s\n」のように書いているつもりなのですが、こちらも問題の原因がわかりません。
【プログラム実行後出力ファイル】 B2023012211234567000012345山田たろう B2023012210123456000001234
【エラーメッセージ】 java.lang.IndexOutOfBoundsException at java.base/java.io.FileOutputStream.writeBytes(Native Method) at java.base/java.io.FileOutputStream.write(FileOutputStream.java:373) at CsvToText10.main(CsvToText10.java:36) 異常終了しました。
該当のソースコード
Java
1//package jp.aast.kyoiku; 2import java.io.*; 3 4 5public class CsvToText10 { 6 7 public static void main(final String args[]) { 8 try ( 9 BufferedReader reader = new BufferedReader(new InputStreamReader( 10 new FileInputStream(args[0]), "Windows-31J")); 11 BufferedWriter writer = new BufferedWriter(new OutputStreamWriter( 12 new FileOutputStream(args[1]), "Windows-31J"))) { 13 14 final FileOutputStream os = new FileOutputStream(args[1]); 15 while (reader.ready()) { 16 //入力ファイルから1行読み込む。 17 final String line = reader.readLine(); 18 19 20 final String enc = "Windows-31J"; 21 22 final String[] items = line.replace("\"", "").split(","); 23 //行データを出力ファイルへ書き出す。 24 os.write(String.format("%-100s", items[0]).getBytes(enc), 0, 1); 25 os.write(String.format("%04d", Integer.parseInt(items[1])).getBytes(enc)); 26 os.write(String.format("%02d", Integer.parseInt(items[2])).getBytes(enc)); 27 os.write(String.format("%02d", Integer.parseInt(items[3])).getBytes(enc)); 28 os.write(String.format("%01d", Integer.parseInt(items[4])).getBytes(enc)); 29 os.write(String.format("%07d", Integer.parseInt(items[5])).getBytes(enc)); 30 os.write(String.format("%09d", Integer.parseInt(items[6])).getBytes(enc)); 31 32 //修正したい箇所 33 //①半角スペースではなく全角スペースにしたい 34 //②改行したい 35 os.write(String.format("%.16s\n", items[7]).getBytes(enc), 0, 32); 36 //os.write(String.format(" ", items[7]).getBytes(enc), 0, 32); 37 //os.write("\n".getBytes(enc)); 38 39 40 } 41 os.close(); 42 43 } catch (Exception e) { 44 e.printStackTrace(); 45 46 System.out.println("異常終了しました。"); 47 System.exit(-1); 48 } 49 50 System.out.println("正常終了しました。"); 51 System.exit(0); 52 53 } 54 55} 56 57
考えをまとめ切れておらず、わかりづらい質問となってしまい申し訳ありませんが、問題の一部分についてのみでもいいのでご回答いただけると幸いです。
お忙しいところ恐縮ですがよろしくお願いいたします。
回答3件
あなたの回答
tips
プレビュー