我正在使用 csv 文件导入一些数据,我应该逐行读取它们并将值分配给字符串,然后将每个值设置为其对象类中的字段名称。 我的问题是某些字段是数字,我需要用空字符串替换空格,以便我可以将字符串值转换为新的 BigDecimal。
java代码:
public static <T> T transformCsvToData(String ligneCsv, Class clazz, String[] fieldNames) {
T t = null;
try {
if (!StringUtils.isBlank(ligneCsv)) {
String[] listValues = ligneCsv.split(String.valueOf(DEFAULT_SEPARATOR));
t = (T) clazz.newInstance();
for (int i=0; i<fieldNames.length; i++) {
String fieldName = fieldNames[i];
String stringValue = listValues.length > i ? listValues[i] : null;
PropertyDescriptor pd = new PropertyDescriptor(fieldName, clazz);
Class fieldType = pd.getPropertyType();
// verifier qu'il existe une methode set
if (pd.getWriteMethod() != null && !"class".equals(pd.getName())) {
// recuperer la methode set
Method writeMethod = pd.getWriteMethod();
Object castedValue = null;
if (StringUtils.isNotBlank(stringValue)) {
try {
stringValue = stringValue.trim();
if (fieldType == String.class) {
castedValue = stringValue;
} else if (fieldType == Boolean.class) {
castedValue = Boolean.valueOf(stringValue.toLowerCase());
} else if (fieldType == Date.class) {
castedValue = new SimpleDateFormat(FORMAT_INPUT_DATE, Locale.FRANCE).parse(stringValue);
} else if (fieldType == Integer.class) {
castedValue = Integer.valueOf(stringValue);
} else {
stringValue = stringValue.replace(",", ".").replace("%", "").replace("\u00A0", " ").replaceAll("\\s+", " ").replaceAll(" ", "");
if (fieldType == BigDecimal.class) {
castedValue = new BigDecimal(stringValue);
} else if (fieldType == Long.class) {
castedValue = Long.valueOf(stringValue);
} else if (fieldType == Double.class) {
castedValue = Double.valueOf(stringValue);
}
}
} catch (NumberFormatException | ParseException ex) {
castedValue = null;
}
}
writeMethod.invoke(t, castedValue);
}
}
}
} catch (Exception e) {
e.printStackTrace();
return null;
}
return t;
}
我的开发本地环境正在 Windows 上运行,一切正常,但是当我构建工件并通过 jenkins 在 ubuntu 服务器上测试它时。该功能未返回正确的结果。
ubuntu 和 windows 服务器之间有什么区别?我该如何解决这个问题? 注意:我也在 Windows 服务器上部署了同样的战争,一切都正常。
我猜数字之间的不是空白,它是一个无法打印的字符,所以尝试使用
stringvalue = stringvalue.replace(",", ".").replaceAll("[^\\d\\.]*", "")
它替换所有不是数字或点的字符