Repository navigation
Expand file tree
/
Copy pathCsvChecker.java
More file actions
executable file
·443 lines (392 loc) · 14.3 KB
/
Copy pathCsvChecker.java
File metadata and controls
executable file
·443 lines (392 loc) · 14.3 KB
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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
package Utility;
import java.io.*;
import java.text.SimpleDateFormat;
import org.w3c.dom.*;
import javax.xml.parsers.*;
import javax.xml.xpath.*;
import com.csvreader.*;
/** îáúåêòû êëàññà îòâå÷àþò çà ïðîâåðêó ñîîòâåòñòâèÿ äàííûõ â XML ôàéëàõ è â CSV */
public class CsvChecker {
private void debug(String information){
//System.out.print(this.getClass().getName());
//System.out.print(" DEBUG ");
//System.out.println(information);
}
private void error(String information){
System.out.print(this.getClass().getName());
System.out.print(" ERROR ");
System.out.println(information);
}
/** âûâîä èíôîðìàöèè äëÿ ïîëíîãî ëîããèðîâàíèÿ â ëîã*/
private void to_log(String information){
System.out.print(" LOG: ");
System.out.println(information);
}
/** ïóòü ê ôàéëó CSV */
private String field_path_to_csv;
/** ïóòü ê ôàéëó XML*/
private String field_path_to_xml;
/** ñïèñîê íàèìåíîâàíèé âñåõ êëàññîâ â XML */
private Field[] field_fields;
/** ôëàã, êîòîðûé ãîâîðèò î íàëè÷èè çàãîëîâêà */
private boolean field_header_exists;
/** ðàçäåëèòåëü, êîòîðûé èñïîëüçóåòñÿ â CSV ôàéëå */
private String field_delimeter=",";
/** ôëàã, êîòîðûé ãîâîðèò îá èñïîëüçîâàíèè êîììåíòàðèåâ*/
private boolean field_comment_exists=true;
/** èìÿ attribute äëÿ NODE êîíòåêñòà DELIMETER */
private static String field_delimeter_xml_attribute="value";
/** èìÿ attribute äëÿ NODE êîíòåêñòà CHECKER */
private static String field_checker_xml_attribute="full_log";
/** âûâîäèòü ïîëíûé ëîã = true, èëè æå âûäàâàòü îøèáêó ïðè ïåðâîì æå åå íàõîæäåíèè=false*/
private boolean field_log_full=false;
/**
* Íà îñíîâå øàáëîíà XML ôàéëà ïðîâåðèòü âàëèäíîñòü äàííûõ â CSV ôàéëå
* @param path_to_xml
* @param path_to_csv
* @throws Exception åñëè ôéëû íå íàéäåíû, ïðîèçîøëà îøèáêà ÷òåíèÿ XML...
*/
public CsvChecker(String path_to_xml, String path_to_csv) throws Exception {
this.field_path_to_csv=path_to_csv;
this.field_path_to_xml=path_to_xml;
this.field_header_exists=false;
debug("check for exists");
try{
if((new File(this.field_path_to_csv)).exists()&&(new File(this.field_path_to_xml).exists())==false){
}
}catch(Exception ex){
error("file is not exists ");
throw new Exception("Ôàéëû íå íàäåíû");
}
debug("parsing XML");
try{
parseXML();
}catch(Exception ex){
error("xml parsing error");
throw new Exception("Îøèáêà ðàçáîðà ôàéëà XML");
}
}
/** ìåòîä, êîòîðûé ÷èòàåò äàííûå èç XML è çàãðóæàåò èõ â ïîëÿ äàííîãî îáúåêòà:
* <li>÷òåíèå íàëè÷èÿ çàãîëîâêà ([HEADER] exists='true')</li>
* <li>÷òåíèå ïîëåé, ðàñïîçíàâàíèå êëàññîâ (class)</li>
* <li>÷òåíèå ïîëåé, ðàñïîçíàâàíèå îáÿçàòåëüíîñòè ïîëÿ (canEmpty)</li>
* */
private void parseXML() throws Exception{
DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
domFactory.setNamespaceAware(true); // never forget this!
DocumentBuilder builder = domFactory.newDocumentBuilder();
Document doc = builder.parse(this.field_path_to_xml);
XPathFactory factory = XPathFactory.newInstance();
XPath xpath = factory.newXPath();
XPathExpression expression;
debug("get DELIMETER");
expression= xpath.compile("//PATTERN/DELIMETER");
field_delimeter=",";
try{
Node node=(Node)expression.evaluate(doc,XPathConstants.NODE);
if(node!=null){
field_delimeter=((Attr)node.getAttributes().getNamedItem(field_delimeter_xml_attribute)).getValue();
debug("DELIMETER is found:"+field_delimeter);
}
}catch(Exception ex){
debug("DELIMETER not found:");
}
debug("get COMMENT");
try{
// check for exists COMMENT
Node comment_node=(Node)xpath.compile("//PATTERN/COMMENT").evaluate(doc,XPathConstants.NODE);
if(comment_node!=null){
// check for exists COMMENT [@exists]
if(comment_node.getAttributes().getNamedItem("exists")!=null){
// find comment [@exists='true']
expression= xpath.compile("//PATTERN/COMMENT[@exists='true']");
Boolean comment_value=(Boolean)expression.evaluate(doc, XPathConstants.BOOLEAN);
if(comment_value!=null){
this.field_comment_exists=comment_value.booleanValue();
}else{
this.field_comment_exists=true;
}
}
}
}catch(Exception ex){
//this.field_comment_exists=true;
}
debug("get HEADER");
expression= xpath.compile("//PATTERN/HEADER[@exists='true']");
Boolean header_value=(Boolean)expression.evaluate(doc, XPathConstants.BOOLEAN);
if(header_value!=null){
this.field_header_exists=header_value.booleanValue();
}else{
this.field_header_exists=false;
}
debug("get ELEMENTS");
expression=xpath.compile("//PATTERN/FIELDS/FIELD");
NodeList nodes=(NodeList)expression.evaluate(doc,XPathConstants.NODESET);
debug("NODESET:"+nodes.getLength());
this.field_fields=new Field[nodes.getLength()];
for(int counter=0;counter<nodes.getLength();counter++){
this.field_fields[counter]=new Field(nodes.item(counter));
}
debug("get CHECKER");
try{
// check for exists COMMENT
Node comment_node=(Node)xpath.compile("//PATTERN/CHECKER").evaluate(doc,XPathConstants.NODE);
if(comment_node!=null){
// check for exists COMMENT [@exists]
if(comment_node.getAttributes().getNamedItem(field_checker_xml_attribute)!=null){
// find comment [@exists='true']
expression= xpath.compile("//PATTERN/CHECKER[@"+field_checker_xml_attribute+"='true']");
Boolean comment_value=(Boolean)expression.evaluate(doc, XPathConstants.BOOLEAN);
if(comment_value!=null){
this.field_log_full=comment_value.booleanValue();
}else{
this.field_log_full=false;
}
}
}
}catch(Exception ex){
//this.field_log_full=false;
}
}
/** ïðîâåðÿåò êîë-âî ýëåìåíòîâ â ÿ÷åéêå
* @param values - çíà÷åíèÿ, ïðî÷èòàííûå èç ôàéëà
* @param fields - ïîëÿ, êîòîðûå ñîäåðæàò îïèñàíèÿ ñòîëáöîâ
* @return <b>true</b> - ðàçìåðíîñòü îäèíàêîâà <br>
* <b>false</b> - íàðóøåíà ðàçìåðíîñòü
* */
private boolean checkValuesCount(String[] values, Field[] fields){
return values.length==fields.length;
}
/** ïðîâåðÿåò óêàçàííóþ ÿ÷åéêó íà ïóñòîå çíà÷åíèå è äîïóñòèìîñòü ïóñòîãî çíà÷åíèÿ
* @param values - ïðî÷èòàííûå èç ôàéëà ÿ÷åéêè â âèäå ìàññèâà ñòðîê
* @param fields - ïîëÿ, êîòîðûå ñîäåðæàò îïèñàíèå ñòîëáöîâ
* @param index - èíäåêñ ïîëÿ, êîòîðûé äîëæåí áûòü ïðîàíàëèçèðîâàí
* @return <b>true</b> - ïîëå ëèáî çàïîëíåíî, ëèáî ïóñòîå, íî ýòî ðàçðåøåíî XML ôàéëîì <br>
* <b>false</b> - åñëè ïîëå ïóñòîå è ýòî íå ðàçðåøåíî
* */
private boolean checkEmpty(String[] values,Field[] fields, int index ){
boolean return_value=false;
String current_value=values[index].trim();
if(current_value.length()>0){
return_value=true;
}else{
if(fields[index].isCanEmpty()){
return_value=true;
}else{
return_value=false;
}
}
return return_value;
}
/** ïðîâåðêà ôàéëà CSV íà ñîîòâåòñòâèå ïðàâèëàì, êîòîðûå ðàçìåùåíû â XML ôàéëå
* @return "" åñëè ôàéë ñîîòâåòñòâóåò
* ëèáî æå âîçâðàùàåò òåêñò îøèáêè
* */
public String checkCSV(){
String return_value="";
/** ôëàã, êîòîðûé ãîâîðèò î íàëè÷èè îøèáêè â ôàéëå */
boolean flag_error=false;
try{
// settings
CsvReader reader=new CsvReader(this.field_path_to_csv);
// set delimeter
try{
debug("SETTINGS: set delimeter");
reader.setDelimiter(this.field_delimeter.charAt(0));
}catch(Exception ex){
error("setDelimeter is error:"+this.field_delimeter);
}
// set use comments
debug("SETTINGS: set use comment"+this.field_comment_exists);
reader.setUseComments(this.field_comment_exists);
// set headers
if(this.field_header_exists==true){
debug("SETTINGS: set header exists");
reader.readHeaders();
if(reader.getHeaderCount()!=this.field_fields.length){
throw new Exception("êîë-âî ñòîëáöîâ â çàãîëîâêå íå ñîâïàäàåò ñ íåîáõîäèìûì");
}
}
// read body
int row_counter=0;
int counter=0;
String[] values;
// check for all rows into file
while(reader.readRecord()){
row_counter++;
values=reader.getValues();
for(counter=0;counter<values.length;counter++){
System.out.print(values[counter]+"; ");
}
// check for all values into file
for(counter=0;counter<values.length;counter++){
// check data count
if(this.checkValuesCount(values, field_fields)){
}else{
if(this.field_log_full){
flag_error=true;
to_log("Row:"+row_counter+" element count is not valid ");
}else{
reader.close();
throw new Exception("Row:"+row_counter+" element count is not valid ");
}
}
// check for empty
if(this.checkEmpty(values, field_fields, counter)){
// OK
}else{
// ERROR
if(this.field_log_full){
flag_error=true;
to_log("Row:"+row_counter+" Column:"+this.field_fields[counter].getColumnName()+"("+(counter+1)+") is Empty");
}else{
reader.close();
throw new Exception("Row:"+row_counter+" Column:"+this.field_fields[counter].getColumnName()+"("+(counter+1)+") is Empty");
}
}
// check for Class
if(!this.field_fields[counter].isParseToClass(values[counter])){
if(this.field_log_full){
flag_error=true;
to_log("Row:"+row_counter+" Column:"+this.field_fields[counter].getColumnName()+"("+(counter+1)+") not instanceof "+this.field_fields[counter].getClassName());
}else{
reader.close();
throw new Exception("Row:"+row_counter+" Column:"+this.field_fields[counter].getColumnName()+"("+(counter+1)+") not instanceof "+this.field_fields[counter].getClassName());
}
}
}
}
reader.close();
}catch(Exception ex){
return_value=ex.getMessage();
flag_error=true;
error("checkCSV Exception:"+ex.getMessage());
}
if(field_log_full){
if(flag_error){
return "Error";
}else{
return "";
}
}else{
return return_value;
}
}
}
/** îáúåêòû, êîòîðûå ñîäåðæàò èíôîðìàöèþ î ñòîëáöå CSV ôàéëà */
class Field{
private static SimpleDateFormat sdf=new SimpleDateFormat("dd.MM.yyyy");
/** ïîëå, êîòîðîå ñîäåðæèò òåêñòîâîå èìÿ êëàññà*/
private String field_class_name;
/** ïîëå, êîòîðîå ñîäåðæèò çíà÷åíèå, ìîãóò ëè îòñóòñòâîâàòü - èìåòü ïóñòîå çíà÷åíèå, äàííûå èç CSV*/
private boolean field_can_empty;
/** ïîëå, êîòîðîå ñîäåðæèò òåêñòîâîå èìÿ ñàìîãî ñòîëáöà */
private String field_column_name;
/** èìÿ àòòðèáóòà FIELD äëÿ îáîçíà÷åíèÿ âîçìîæíîñòè ïóñòîãî çíà÷åíèÿ */
private static String field_xml_canEmpty="can_empty";
/** èìÿ àòòðèáóòà FIELD äëÿ îáîçíà÷åíèÿ èìåíè ïîëÿ */
private static String field_xml_fieldName="field_name";
/** èìÿ àòòðèáóòà FIELD äëÿ îáîçíà÷åíèÿ êëàññà ïåðåìåííîé, ñîõðàíåííîé êàê òåêñò - âî ÷òî êîíâåðòèðîâàòü */
private static String field_xml_class="class";
/**
* Îáúåêò, êîòîðûé ñîäåðæèò îïèñàíèå ñòîëáöà èç XML
* @param class_name
* @param is_can_empty
*/
/* public Field(String class_name, String is_can_empty){
this.field_class_name=class_name;
field_can_empty=Boolean.valueOf(is_can_empty);
}
*/
/**
* Îáúåêò, êîòîðûé ñîäåðæèò îïèñàíèå ñòîëáöà èç XML
*/
public Field(Node node) throws Exception{
NamedNodeMap attributes=node.getAttributes();
Attr attribute;
// canEmpty
attribute=((Attr)attributes.getNamedItem(field_xml_canEmpty));
this.field_can_empty=Boolean.parseBoolean(attribute.getValue());
// class
attribute=((Attr)attributes.getNamedItem(field_xml_class));
this.setClass(attribute.getValue());
// fieldName
attribute=((Attr)attributes.getNamedItem(field_xml_fieldName));
this.setFieldName(attribute.getValue());
}
private void setClass(String class_name){
this.field_class_name="java.lang.Object";
this.field_class_name=class_name;
}
private void setFieldName(String fieldName){
this.field_column_name=fieldName;
}
/** ìîæåò ëè äàííûé îáúåêò íå èìåòü çíà÷åíèé - áûòü ïóñòûì */
public boolean isCanEmpty(){
return this.field_can_empty;
}
/** âîçâðàùàåò true, åñëè ïåðåäàííîå çíà÷åíèå String ìîæåò áûòü ïðåîáðàçîâàíî â äàííûé òèï */
public boolean isParseToClass(String value){
boolean return_value=false;
if(this.getClassName().equals("java.lang.Integer")){
try{
Integer.parseInt(value);
return_value=true;
}catch(Exception ex){
if((value.trim().length()==0)&&(this.isCanEmpty())){
return_value=true;
}
}
};
if(this.getClassName().equals("java.lang.String")){
return_value=true;
};
if(this.getClassName().equals("java.lang.Float")){
try{
Float.parseFloat(value);
return_value=true;
}catch(Exception ex){
value=value.replaceAll(",", ".");
try{
Float.parseFloat(value);
return_value=true;
}catch(Exception ex2){
if((value.trim().length()==0)&&(this.isCanEmpty())){
return_value=true;
}
};
}
};
if(this.getClassName().equals("java.util.Date")){
try{
sdf.parse(value);
return_value=true;
}catch(Exception ex){}
};
if(this.getClassName().equals("java.lang.Double")){
try{
Double.parseDouble(value);
return_value=true;
}catch(Exception ex){
value=value.replaceAll(",", ".");
try{
Double.parseDouble(value);
return_value=true;
}catch(Exception ex2){
if((value.trim().length()==0)&&(this.isCanEmpty())){
return_value=true;
}
};
};
};
return return_value;
}
/** âîçâðàùàåò èìÿ êëàññà */
public String getClassName(){
return this.field_class_name;
}
/** âîçâðàùàåò èìÿ ñòîëáöà */
public String getColumnName(){
return this.field_column_name;
}
}