質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

1回答

6863閲覧

CSVファイルを固定長のテキストファイルに出力したい

Ry_1

総合スコア1

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2021/03/21 05:52

編集2021/03/22 01:59

前提・実現したいこと

【変換前CSVファイル】 "1","コンビニ","100-0000","東京都","Aビル2階"

上記のようなCSVファイルをJavaで読み込み、テキストファイルに変換するプログラムを作っています。
それぞれ(10バイト,20バイト,8バイト,8バイト,20バイト)の固定長で変換したいと思っています。
データ例:
変換前:1(1バイト)
変換後:0000000001(10バイト)

変換前:Aビル2階(9バイト)
変換後:Aビル2階□□□□□␣(20バイト)

【変換後テキストファイル】 0000000001コンビニ□□□□□□100-0000東京都□Aビル2階□□□□□␣

発生している問題・エラーメッセージ

CSVファイルをテキストファイルに変換することはできましたが、どうすればそれぞれ異なる固定長に変換できるのかが分かりません。

該当のソースコード

JAVA

1public class Csv { 2 3 public static void main(String args[]) { 4 try (  //変換前CSVファイル読み込み 5 BufferedReader reader = new BufferedReader(new InputStreamReader( 6 new FileInputStream(args[0]), "Windows-31J")); 7     //変換後テキストファイル指定 8 BufferedWriter writer = new BufferedWriter(new OutputStreamWriter( 9 new FileOutputStream(args[1]), "Windows-31J"))) { 10 11   String line; 12 while (true) { 13 //入力ファイルから1行読み込む。 14 line = reader.readLine(); 15 if (line == null) { 16 break; 17 } 18 19 String[] values = line.substring(1, line.length() - 1).split("\",\""); 20 for (String elem : values) { 21 //行データを出力ファイルへ書き出す。 22 writer.write(elem); 23 writer.write("\r\n"); 24 } 25 26 } 27 28 } catch (Exception e) { 29 e.printStackTrace(); 30 System.out.println("異常終了しました。"); 31 System.exit(-1); 32 } 33 34 System.out.println("正常終了しました。"); 35 System.exit(0); 36 37 } 38 39}

【追記】現状のコード

JAVA

1package 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 CsvToText { 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("%010d", Integer.parseInt(items[0])).getBytes(enc)); 29 os.write(String.format("%-100s", items[1]).getBytes(enc), 0, 20); 30 os.write(String.format("%-100s", items[2]).getBytes(enc), 0, 8); 31 os.write(String.format("%-100s", items[3]).getBytes(enc), 0, 8); 32 os.write(String.format("%-100s", items[4]).getBytes(enc), 0, 20); 33 34 os.close(); 35 36 } 37 38 } catch (Exception e) { 39 e.printStackTrace(); 40 41 System.out.println("異常終了しました。"); 42 System.exit(-1); 43 } 44 45 System.out.println("正常終了しました。"); 46 System.exit(0); 47 48 } 49 50} 51 52 53

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

コメントしたByteBufferは不要でした。失礼。

普通にOutputStream#write()すればいいのでは。

java

1import javax.xml.bind.DatatypeConverter; 2import java.io.ByteArrayOutputStream; 3 4public class HogeCsv { 5 6 public static void main(final String[] args) throws Exception { 7 final String line = "\"1\",\"コンビニ\",\"100-0000\",\"東京都\",\"Aビル2階\""; 8 final String[] items = line.replace("\"", "").split(","); 9 10 final ByteArrayOutputStream os = new ByteArrayOutputStream(); 11 12 final String enc = "Windows-31J"; 13 14 os.write(String.format("%010d", Integer.parseInt(items[0])).getBytes(enc)); 15 os.write(String.format("%-100s", items[1]).getBytes(enc), 0, 20); 16 os.write(String.format("%-100s", items[2]).getBytes(enc), 0, 8); 17 os.write(String.format("%-100s", items[3]).getBytes(enc), 0, 8); 18 os.write(String.format("%-100s", items[4]).getBytes(enc), 0, 20); 19 20 System.out.println(DatatypeConverter.printHexBinary(os.toByteArray())); 21 System.out.println(new String(os.toByteArray(), enc)); 22 } 23}

投稿2021/03/21 07:40

shiketa

総合スコア3971

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Ry_1

2021/03/21 09:20

回答ありがとうございます。 変換前のCSVファイルは複数あり、任意の物をコマンドライン上で入力して、任意の名前の.txtファイルに変換するという形にしたいので、 try (  //変換前CSVファイル読み込み BufferedReader reader = new BufferedReader(new InputStreamReader( new FileInputStream(args[0]), "Windows-31J"));      //変換後テキストファイル指定 BufferedWriter writer = new BufferedWriter(new OutputStreamWriter( new FileOutputStream(args[1]), "Windows-31J"))) { の箇所はそのままにしたいのですが、特にやることは変わらないのでしょうか? 説明が不足しており申し訳ありません。
shiketa

2021/03/21 12:09

内容をダンプしやすいようにByteArrayOutputStreamを使っただけです。かわりにFileOutputStreamを使えばいいのではないでしょうか。
Ry_1

2021/03/22 02:03 編集

ありがとうございます。出力できました。 もうひとつ質問なのですが、csvファイルが "1","コンビニ","100-0000","東京都","Aビル2階" "2","スーパー","200-0000","静岡県","Bビル8階" の様に複数列ある場合、for文で繰り返し処理をするのだと思いますが、どのように記述すればよいのでしょうか?
shiketa

2021/03/22 01:21

は? 自分で書いているじゃないですか。 ``` try (  //変換前CSVファイル読み込み BufferedReader reader = new BufferedReader(new InputStreamReader( new FileInputStream(args[0]), "Windows-31J")); ...   String line; while (true) { //入力ファイルから1行読み込む。 line = reader.readLine(); if (line == null) { break; } ... } ```
shiketa

2021/03/22 01:26

でも、自分ならこう書きます。 ``` try (  //変換前CSVファイル読み込み BufferedReader reader = new BufferedReader(new InputStreamReader( new FileInputStream(args[0]), "Windows-31J")); ... while (reader.ready()) { //入力ファイルから1行読み込む。 final String line = reader.readLine(); ... } ```
Ry_1

2021/03/22 02:03

複数列あるcsvファイルを入力すると、最後の列のデータだけが出力される状況になっており、改善策を考えています。 現状のコードを追記しておきます。
shiketa

2021/03/22 02:56 編集

変数writerとosの定義位置と意味とをよく検討されてはいかがかと。
Ry_1

2021/03/22 03:17

閉じる位置とfinal FileOutputStream os = new FileOutputStream(args[1]);の位置が原因でしたね。 丁寧なアドバイスありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問