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
Tout d'abord, est-ce que j'utilise la bonne manière de faire ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part org.springframework.batch.item.file.FlatFileParseException: Unexpected end of file before record complete
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
Sinon dois-je faire autrement ?
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 ""; }
Dois-je m'y prendre directement dans l'ItemReader ?
Si oui, auriez vous un exemple ?
Merci
Partager