Bonjour,

Je souhaite lire les enregistrements d'un fichier csv, par Client afin de traiter, par la suite, les informations dans l'ItemProcessor avec l'Objet Client, pour ensuite écrire les données du client en base de données

Versions :
- java 1.8
- springBatch : 3.0.7.RELEASE

Ci-dessous le fichier client CSV
client1;adresse;adresse1
client1;telephone;telephone1;telephone1
client1;facture;facture1
client2;adresse;adresse1;adresse2
client2;telephone;telephone1
client2;facture;facture1
client3;adresse;adresse1
client3;telephone;telephone1
client3;facture;facture1;facture2
EndOfClients

J'utilise RecordSeparatorPolicy pour récupérer les données par client
Avec la méthode isEndOfRecord, j'indique le changement de client pour transmettre les données, via la méthode postProcess, au LineMapper ci dessous les enregistrements passés par la méthode :
postProcess = client1;adresse;adresse1||client1;telephone;telephone1;telephone1||client1;facture;facture1
postProcess = client2;adresse;adresse1;adresse2||client2;telephone;telephone1||client2;facture;facture1
postProcess = client3;adresse;adresse1||client3;telephone;telephone1||client3;facture;facture1;facture2

Avant la concaténation des enregistrements, j'insére un séparateur d'enregistrement "||" afin de pouvoir décomposer
mes enregistrements et construire mon objet Client dans le LineMapper
LineMapper : client1;adresse;adresse1||client1;telephone;telephone1;telephone1||client1;facture;facture1
LineMapper : client2;adresse;adresse1;adresse2||client2;telephone;telephone1||client2;facture;facture1
LineMapper : client3;adresse;adresse1||client3;telephone;telephone1||client3;facture;facture1;facture2

Et écrire dans l'ItemWriter avec l'objet Client
ItemWriter = le client1 a : 1 adresse, 2 numero de telephone, 1 facture
ItemWriter = le client2 a : 2 adresse, 1 numero de telephone, 1 facture
ItemWriter = le client3 a : 1 adresse, 1 numero de telephone, 2 facture

Le soucis est que je suis obligé d'ajouter dans mon fichier csv un indicateur de fin de ligne : EndOfClients
afin que le client3 soit transmis vers le LineMapper, sinon j'obtiens l'erreur suivante
Code : Sélectionner tout - Visualiser dans une fenêtre à part
org.springframework.batch.item.file.FlatFileParseException: Unexpected end of file before record complete
Tout d'abord, est-ce que j'utilise la bonne manière de faire ?
Si la manière est bonne, comment puis-je détecter que je suis en fin de ligne afin de transmettre le dernier client3 au LineMapper, sans utiliser EndOfClients ?

Ci-dessous le code du ClientRecordSeparatorPolicy
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
 
public class ClientRecordSeparatorPolicy implements RecordSeparatorPolicy {
 
	// Separateur de champ d'un enregistrement
	private String fieldSeparator = ";";
	// Separateur d'enregistrement
	private String recordSeparator = "||";
	private String END_OF_CLIENT = "EndOfClients";
 
	private DelimitedLineTokenizer tokenizer = new DelimitedLineTokenizer(fieldSeparator);
	private String previousClient;
	private List<String> listLineClient = new ArrayList<String>();
 
 
	public boolean isEndOfRecord(String record) {
		FieldSet fieldSet = tokenizer.tokenize(record);
		String currentClient;
 
		// Test si fin de fichier
		if (END_OF_CLIENT.equalsIgnoreCase(record)) {
			return true;
		}	
 
		// Test si init
		currentClient = fieldSet.readString(0);
		if (previousClient != null) {
 
			// Test rupture
			if (!currentClient.equalsIgnoreCase(previousClient)) {
				previousClient = currentClient;
				return true;
			}
 
		} else {
			// Init 1ier record
			previousClient = currentClient;
		}
 
//		System.out.println("isEndOfRecord = " + record);
		return false;
	}
 
	public String postProcess(String record) {
		String clientRecords = listLineClient.stream().collect(Collectors.joining(recordSeparator));
		listLineClient.clear();
		listLineClient.add(record);
		System.out.println("postProcess = " + clientRecords);
		return clientRecords;
	}
 
	public String preProcess(String record) {
		listLineClient.add(record);
//		System.out.println("preProcess = " + record);
		return "";
	}
Sinon dois-je faire autrement ?
Dois-je m'y prendre directement dans l'ItemReader ?
Si oui, auriez vous un exemple ?

Merci