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
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