質問するログイン新規登録

Q&A

1回答

389閲覧

FlatFileItemReder setCommentsの使い方

hanahanahana

総合スコア5

Spring Batch

Spring Batchは、バッチ処理向けに定義されたオープンソースのフレームワーク。エンタープライズシステムで避けて通れないバッチ処理を可能にします。設定ファイルに別定義することで効率よく開発することがで可能です。

Java

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

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

0グッド

0クリップ

投稿2025/09/04 07:35

0

0

実現したいこと

フレームワークはSpringを使用しています。
FlatFileItemReder setCommentsの使い方をご存知の方いらっしゃいましたら教えていただきたいです。
String配列を渡せばいいのはjavaリファレンスを読んで分かりましたが、使用例が検索しても出てきません。

発生している問題・分からないこと

※ちなみにやりたいことは、読み込んだファイルの行の先頭文字が特定の文字だった場合、その行を読み込まない、ということをやりたいです。

該当のソースコード

特になし

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

使用例は出てきませんでした。

補足

特になし

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

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

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

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

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

jimbe

2025/09/05 11:33

揚げ足取るつもりは無いですが・・・ FlatFileItemReader では無いですか?
guest

回答1

0

FlatFileItemReder setCommentsの使い方をご存知の方いらっしゃいましたら教えていただきたいです。
String配列を渡せばいいのはjavaリファレンスを読んで分かりましたが、使用例が検索しても出てきません。

確かに、Spring Batch関連のサンプルコードは少ないようです。まぁ、もともとFlatFileItemReader クラスやそのsetComments メソッドの使い方を知っている人は少ないでしょうし、知っていても本質問を閲覧しているとは限りませんから、そんな場合は実際に書いて試してみるのが一番の近道です。

FlatFileItemReaderクラスは知りませんでしたが、興味がわいたので試してみました。まず簡単に、FlatFileItemReader.setCommentsメソッドについては、例えばこんな風に使います。

Java

1 FlatFileItemReader<Hoge> reader = new FlatFileItemReader<>(); 2 3 // コメント行とみなす行頭の文字列群をセット 4 reader.setComments(new String[] { "#", ";", "//" });

Spring Batchのテスト用コードを書いて実際に試してみます。まず、ID, 名前, 年齢がCSV形式で保存されているデータファイルdata.csvを用意します。1行目はヘッダーで、"#", ";", "//" が行頭にあったらそれはコメント行とします。

  • src/main/resources/data.csv

plaintext

1id,name,age 21,James,15 32,Mary,20 4# comment1 5; comment2 63,Michael,25 7// comment3 84,Patricia,30

data.csvの各行の項目がマップされるPersonクラスです。greetメソッドで挨拶用の文字列を出力します。

  • src/main/java/com/example/test4/Person.java

Java

1package com.example.test4; 2 3public class Person { 4 private int id; 5 private String name; 6 private int age; 7 private int lineNumber; // 行番号 8 9 public int getId() { 10 return this.id; 11 } 12 13 public void setId(int id) { 14 this.id = id; 15 } 16 17 public String getName() { 18 return this.name; 19 } 20 21 public void setName(String name) { 22 this.name = name; 23 } 24 25 public int getAge() { 26 return this.age; 27 } 28 29 public void setAge(int age) { 30 this.age = age; 31 } 32 33 public int getLineNumber() { 34 return this.lineNumber; 35 } 36 37 public void setLineNumber(int lineNumber) { 38 this.lineNumber = lineNumber; 39 } 40 41 @Override 42 public String toString() { 43 String result = String.format("id=%d, name=%s, age=%d", id, name, age); 44 return result; 45 } 46 47 public String greet() { 48 String result = String.format("Hello! My name is %s. %d years old. (id=%d, lineNumber=%d)", name, age, id, 49 lineNumber); 50 return result; 51 } 52}

で、LineMapper をimplementsしたPersonLineMapperクラスです。

  • src/main/java/com/example/test4/PersonLineMapper.java

Java

1package com.example.test4; 2 3import org.springframework.batch.item.file.LineMapper; 4 5public class PersonLineMapper implements LineMapper<Person> { 6 @Override 7 public Person mapLine(String line, int lineNumber) { 8 String[] fields = line.split(","); 9 Person person = new Person(); 10 person.setId(Integer.parseInt(fields[0])); 11 person.setName(fields[1]); 12 person.setAge(Integer.parseInt(fields[2])); 13 person.setLineNumber(lineNumber); 14 return person; 15 } 16}

BatchConfigです。

  • src/main/java/com/example/test4/BatchConfig.java

Java

1package com.example.test4; 2 3import org.springframework.batch.core.Job; 4import org.springframework.batch.core.Step; 5import org.springframework.batch.core.job.builder.JobBuilder; 6import org.springframework.batch.core.repository.JobRepository; 7import org.springframework.batch.core.step.builder.StepBuilder; 8import org.springframework.context.annotation.Bean; 9import org.springframework.context.annotation.Configuration; 10import org.springframework.core.io.ClassPathResource; 11import org.springframework.transaction.PlatformTransactionManager; 12import org.springframework.batch.item.file.FlatFileItemReader; 13 14@Configuration 15public class BatchConfig { 16 17 @Bean 18 public FlatFileItemReader<Person> reader() { 19 FlatFileItemReader<Person> reader = new FlatFileItemReader<>(); 20 reader.setResource(new ClassPathResource("data.csv")); 21 // 1行目のヘッダーをスキップ 22 reader.setLinesToSkip(1); 23 24 // コメント行とみなす行頭の文字列群をセット 25 reader.setComments(new String[] { "#", ";", "//" }); 26 reader.setLineMapper(new PersonLineMapper()); 27 return reader; 28 } 29 30 @Bean 31 public Step step1(JobRepository jobRepository, PlatformTransactionManager transactionManager) { 32 return new StepBuilder("step1", jobRepository).<Person, Person>chunk(10, transactionManager).reader(reader()) 33 .writer(items -> items.forEach((item) -> { 34 System.out.println(">>> " + item.greet()); 35 })).build(); 36 } 37 38 @Bean 39 public Job job(JobRepository jobRepository, Step step1) { 40 return new JobBuilder("job", jobRepository).start(step1).build(); 41 } 42}

これを実行すると、writerによりターミナル上で以下のような出力を得られます。

terminal

1...略 2>>> Hello! My name is James. 15 years old. (id=1, lineNumber=2) 3>>> Hello! My name is Mary. 20 years old. (id=2, lineNumber=3) 4>>> Hello! My name is Michael. 25 years old. (id=3, lineNumber=6) 5>>> Hello! My name is Patricia. 30 years old. (id=4, lineNumber=8) 6...略

CSVファイルのコメント行はスキップされ、各々のレコードがオブジェクトにマップされてPerson.greetメソッドで出力されているのが分かります。FlatFileItemReader.setCommentsメソッド、便利ですね。

最後にバージョン情報も簡単に載せておきます。

  • Eclipse IDE: 2025-06 (4.36.0)
  • Spring Boot: 3.5.5
  • Java: 11

投稿2025/09/06 05:51

dodox86

総合スコア9427

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

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

hanahanahana

2025/09/08 10:55

詳細に回答してくださり、ありがとうございました! ベストアンサーに選ばせていただきました。
dodox86

2025/09/09 01:53

お役に立てたようでよかったです。 > ベストアンサーに選ばせていただきました。 えっと、ご質問が解決済みになっていないようです。こちらもお願いします。 [質問を解決済みにしたい] https://teratail.com/help#resolve-question
dodox86

2025/10/18 02:32

@eva753kim さん 謎のAIコメントは止めてください。私の書いた文からの欠落した引用ですよね。 Please do not post an incomprehensible comment. Your content is just lacking quotation of mine.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.29%

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

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

質問する

関連した質問