Revision 41062 trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.file/org.gvsig.fmap.dal.file.csv/src/main/java/org/gvsig/fmap/dal/store/csv/CSVStoreProvider.java

View differences:

CSVStoreProvider.java
27 27
import java.io.FileReader;
28 28
import java.io.FileWriter;
29 29
import java.io.IOException;
30
import java.net.URL;
31
import java.text.SimpleDateFormat;
30 32
import java.util.ArrayList;
31 33
import java.util.HashMap;
32 34
import java.util.Iterator;
......
577 579
		}
578 580
	}
579 581
    
580
    private EditableFeatureType getFeatureType(String headers[]) {
582
    private EditableFeatureType getFeatureType(String headers[], int automaticTypes[]) {
581 583
		EditableFeatureType fType =	getStoreServices().createFeatureType(this.getName());
582 584
		fType.setHasOID(true);
583 585
		DataTypesManager dataTypesManager = ToolsLocator.getDataTypesManager();
584 586
		
585 587
    	int[] types = new int[headers.length];
588
    	//
589
    	// Calculamos cuales pueden ser los tipos de datos
590
    	//
591
    	
592
    	// Por defecto todos string
593
    	for( int i=0; i<types.length ; i++) {
594
    		types[i] = DataTypes.STRING;
595
    	}
596
    	
597
    	// Luego asuminos los tipos pasados por parametro, que se supone
598
    	// son los detectados automaticamente.
599
		if (automaticTypes != null) {
600
			for (int i = 0; i < types.length && i < automaticTypes.length; i++) {
601
				types[i] = automaticTypes[i];
602
			}
603
		}
604
    	
605
    	// Luego probamos con lo que diga las cabezeras del CVS, sobreescribiendo
606
    	// los tipos anteriores en caso de definirse en la cabezara.
586 607
    	for( int i=0; i<types.length; i++) {
587 608
    		String s = headers[i];
588 609
    		String typename = null;
......
596 617
        			headers[i] = ss[0];
597 618
        			typename = ss[1];
598 619
        			types[i] = dataTypesManager.getType(typename); 
599
    		} else {
600
    			types[i] = DataTypes.STRING;
601
    			typename = "string";
602 620
    		}
603 621
			if( types[i]==DataTypes.INVALID ) {
604 622
				types[i] = DataTypes.STRING;
......
606 624
			}
607 625
    	}
608 626
    	
627
    	// Y por ultimo hacemos caso a lo que se haya especificado en los parametros
628
    	// de apertura del CSV, teniendo esto prioridad sobre todo.
609 629
    	int[] param_types = CSVStoreParameters.getFieldTypes(this.getParameters());
610 630
    	if( param_types != null ) {
611 631
        	for( int i=0; i<types.length && i<param_types.length; i++) {
612 632
        		types[i] = param_types[i];
613 633
        	}
614 634
    	}
635
    	
636
    	//
637
    	// Una vez ya sabemos los tipos de datos rellenamos el feature-type
638
    	//
615 639
    	int[] param_sizes = CSVStoreParameters.getFieldSizes(this.getParameters());
616 640
    	for(int i=0; i<types.length; i++) {
617 641
			int fieldType = types[i];
......
693 717
		FileReader in = null;
694 718
		CsvListReader reader = null;
695 719
		try {
696
			Envelope envelope = null;
697 720
			String headers[] = null;
698 721
			FeatureStoreProviderServices store = this.getStoreServices();
699 722

  
......
718 741
			}
719 742

  
720 743
			// Initialize the feature types
721
			EditableFeatureType edftype = this.getFeatureType(headers);
744
			EditableFeatureType edftype = this.getFeatureType(headers, automaticDetectionOfTypes());
722 745
			FeatureType ftype = edftype.getNotEditableCopy();
723 746
			List<FeatureType> ftypes = new ArrayList<FeatureType>();
724 747
			ftypes.add(ftype);
......
746 769

  
747 770
			int count_errors = 0;
748 771
			List<String> row = reader.read();
772
			
749 773
			while (row != null) {
750 774
				taskStatus.setCurValue(++count);
751 775
				FeatureProvider feature = this.createFeatureProvider(ftype);
......
808 832
			}
809 833
		}
810 834
	}
835
	
836
	private int[] automaticDetectionOfTypes() throws IOException {
837
		boolean automatic_types_detection = CSVStoreParameters.getAutomaticTypesDetection(getCSVParameters());
838
		if( !automatic_types_detection ) {
839
			return  null;
840
		}
841
		
842
		final int T_INT = 0;
843
		final int T_FLOAT = 1;
844
		final int T_DOUBLE = 2;
845
		final int T_LONG = 3;
846
		final int T_URL = 4;
847
		final int T_DATE = 5;
848
		boolean possibleDataTypes[][] = null;
849
		int[] types = null;
811 850

  
851
		FileReader in = null;
852
		CsvListReader reader = null;
853
		String headers[] = null;
854
		SimpleDateFormat dateFormat = new SimpleDateFormat();
855

  
856
		try {
857
			CsvPreference preferences = getCSVPreferences();
858
			in = new FileReader(this.getCSVParameters().getFile());
859

  
860
			reader = new CsvListReader(in, preferences);
861
			headers = reader.getHeader(true);
862
			if (headers == null) {
863
				headers = CSVStoreParameters.getHeaders(getCSVParameters());
864
			}
865
			types = new int[headers.length]; 
866

  
867
			possibleDataTypes = new boolean[headers.length][6]; 
868
			for (int i = 0; i < possibleDataTypes.length; i++) {
869
				for( int j=0; j<4; j++ ) {
870
					possibleDataTypes[i][j] = true;  
871
				}
872
			}
873
			List<String> row = reader.read();
874

  
875
			while (row != null) {
876
				for (int i = 0; i < row.size(); i++) {
877
					Object rawvalue = row.get(i);
878
					Object value = null;
879
					if( possibleDataTypes[i][T_DOUBLE] ) {
880
						try {
881
							value = Double.parseDouble((String) rawvalue);
882
							possibleDataTypes[i][T_DOUBLE] = true;
883
						} catch (Exception ex) {
884
							possibleDataTypes[i][T_DOUBLE] = false;
885
						}
886
					}
887
					if( possibleDataTypes[i][T_FLOAT] ) {
888
						try {
889
							value = Float.parseFloat((String) rawvalue);
890
							possibleDataTypes[i][T_FLOAT] = true;
891
						} catch (Exception ex) {
892
							possibleDataTypes[i][T_FLOAT] = false;
893
						}
894
					}
895
					if (possibleDataTypes[i][T_LONG]) {
896
						try {
897
							value = Long.parseLong((String) rawvalue);
898
							possibleDataTypes[i][T_LONG] = true;
899
						} catch (Exception ex) {
900
							possibleDataTypes[i][T_LONG] = false;
901
						}
902
					}
903
					if (possibleDataTypes[i][T_INT]) {
904
						try {
905
							value = Integer.parseInt((String) rawvalue);
906
							possibleDataTypes[i][T_INT] = true;
907
						} catch (Exception ex) {
908
							possibleDataTypes[i][T_INT] = false;
909
						}
910
					}					
911
					if (possibleDataTypes[i][T_DATE]) {
912
						try {
913
							value = dateFormat.parse((String) rawvalue);
914
							possibleDataTypes[i][T_DATE] = true;
915
						} catch (Exception ex) {
916
							possibleDataTypes[i][T_DATE] = false;
917
						}
918
					}					
919
					if (possibleDataTypes[i][T_URL]) {
920
						try {
921
							value = new URL((String) rawvalue);
922
							possibleDataTypes[i][T_URL] = true;
923
						} catch (Exception ex) {
924
							possibleDataTypes[i][T_URL] = false;
925
						}
926
					}					
927
				}
928
				row = reader.read();
929
			}
930
		} finally {
931
			if (reader != null) {
932
				try {
933
					reader.close();
934
				} catch (Exception ex) {
935
					// Do nothing
936
				}
937
				reader = null;
938
			}
939
			if (in != null) {
940
				try {
941
					in.close();
942
				} catch (Exception ex) {
943
					// Do nothing
944
				}
945
				in = null;
946
			}
947

  
948
		}
949
		for (int i = 0; i < possibleDataTypes.length ; i++) {
950
			if( possibleDataTypes[i][T_DOUBLE] ) {
951
				types[i] = DataTypes.DOUBLE;
952
				continue;
953
			}
954
			if( possibleDataTypes[i][T_FLOAT] ) {
955
				types[i] = DataTypes.FLOAT;
956
				continue;
957
			}
958
			if( possibleDataTypes[i][T_LONG] ) {
959
				types[i] = DataTypes.LONG;
960
				continue;
961
			}
962
			if( possibleDataTypes[i][T_INT] ) {
963
				types[i] = DataTypes.INT;
964
				continue;
965
			}
966
			if( possibleDataTypes[i][T_URL] ) {
967
				types[i] = DataTypes.URL;
968
				continue;
969
			}
970
			if( possibleDataTypes[i][T_DATE] ) {
971
				types[i] = DataTypes.DATE;
972
				continue;
973
			}
974
			types[i] = DataTypes.STRING;
975
		}
976
		return types;
977
	}
978

  
812 979
}

Also available in: Unified diff