実現したいこと
フレームワークはSpringを使用しています。
FlatFileItemReder setCommentsの使い方をご存知の方いらっしゃいましたら教えていただきたいです。
String配列を渡せばいいのはjavaリファレンスを読んで分かりましたが、使用例が検索しても出てきません。
発生している問題・分からないこと
※ちなみにやりたいことは、読み込んだファイルの行の先頭文字が特定の文字だった場合、その行を読み込まない、ということをやりたいです。
該当のソースコード
特になし
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
使用例は出てきませんでした。
補足
特になし
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答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
総合スコア9427
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。