前提・ 実現したいこと
【実現したいこと一覧】
①ダブルコーテーションがあったら、削除してテキストファイルに書き込みたい(すでに実装済み?)
②数値項目は値の前に、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文字))の固定長で変換したいと思っています。
データ例(数値項目):
変換前:1
変換後:01(2バイト)
データ例(半角文字項目):
変換前:"B"
変換後:B(1バイト)
データ例(半角文字項目):
変換前:"G"
変換後:G␣(2バイト)
※半角スペースは␣で表現しています
データ例(全角文字項目):
変換前:"佐藤けん□□□□"
変換後:佐藤けん□□□□□□□□□□□□(32バイト)
※全角スペースは□で表現しています。また、半角全角混合のパターンは無いと想定しています。
発生している問題・エラーメッセージ
名前(山田たろう)がnumberで認識されちゃってるのでエラー(34行目)が発生している?みたいなことは何となくわかるのですが、具体的に何が問題なのかがわかりません。
また、「%04d」は0を4つdecimalで出力みたいな感じの意味を調べて理解できたのですが、「%-100s」の意味や28行目全体のそもそもの意味が調べてもよくわかっておらず、エラーが解消できていないと思っています。
【エラーメッセージ】 java.lang.NumberFormatException: For input string: "山田たろう " at java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:67) at java.base/java.lang.Integer.parseInt(Integer.java:665) at java.base/java.lang.Integer.parseInt(Integer.java:781) at CsvToText5.main(CsvToText5.java:34) 異常終了しました。
該当のソースコード
Java
1//package jp.aast.kyoiku; 2import java.io.BufferedReader; 3import java.io.BufferedWriter; 4import java.io.FileInputStream; 5import java.io.FileOutputStream; 6import java.io.InputStreamReader; 7import java.io.OutputStreamWriter; 8 9 10public class CsvToText5 { 11 12 public static void main(final String args[]) { 13 try ( 14 BufferedReader reader = new BufferedReader(new InputStreamReader( 15 new FileInputStream(args[0]), "Windows-31J")); 16 BufferedWriter writer = new BufferedWriter(new OutputStreamWriter( 17 new FileOutputStream(args[1]), "Windows-31J"))) { 18 19 while (reader.ready()) { 20 //入力ファイルから1行読み込む。 21 final String line = reader.readLine(); 22 final FileOutputStream os = new FileOutputStream(args[1]); 23 24 final String enc = "Windows-31J"; 25 26 final String[] items = line.replace("\"", "").split(","); 27 //行データを出力ファイルへ書き出す。 28 os.write(String.format("%-100s", items[0]).getBytes(enc), 0, 1); 29 os.write(String.format("%04d", Integer.parseInt(items[1])).getBytes(enc)); 30 os.write(String.format("%02d", Integer.parseInt(items[2])).getBytes(enc)); 31 os.write(String.format("%02d", Integer.parseInt(items[3])).getBytes(enc)); 32 os.write(String.format("%01d", Integer.parseInt(items[4])).getBytes(enc)); 33 os.write(String.format("%07d", Integer.parseInt(items[5])).getBytes(enc)); 34 os.write(String.format("%09d", Integer.parseInt(items[6])).getBytes(enc)); 35 os.write(String.format("%-100s", items[7]).getBytes(enc), 0, 32); 36 37 os.close(); 38 39 } 40 41 } catch (Exception e) { 42 e.printStackTrace(); 43 44 System.out.println("異常終了しました。"); 45 System.exit(-1); 46 } 47 48 System.out.println("正常終了しました。"); 49 System.exit(0); 50 51 } 52 53} 54 55
考えをまとめ切れておらず、わかりづらい質問となってしまい申し訳ありませんが、問題の一部分についてのみでもいいのでご回答いただけると幸いです。
お忙しいところ恐縮ですがよろしくお願いいたします。

回答2件
あなたの回答
tips
プレビュー