如何让CsvToBean将特定字符串/字符映射为Bean类中的null值?
如何用CsvToBean将特定字符串映射为null值
当然可以实现这个需求!默认的CSVReaderNullFieldIndicator确实只能处理缺失字段或者空字符串这类情况,但对于像带引号的"-"这种特定值,我们可以通过自定义转换器来解决。下面是具体的实现步骤:
1. 创建自定义转换器
我们需要实现Apache Commons CSV提供的Converter接口,在转换器里判断字段值是否为目标特定字符串,是的话就返回null:
import org.apache.commons.beanutils.Converter; public class StringToNullConverter implements Converter { @Override public Object convert(Class type, Object value) { if (value == null) { return null; } String strValue = value.toString().trim(); // 这里判断是否是你需要转为null的特定值,比如带引号的"-" if ("\"-\"".equals(strValue) || "-".equals(strValue)) { return null; } return strValue; } }
注:这里我同时处理了带引号和不带引号的
-,你可以根据自己CSV的实际格式调整判断条件。
2. 在Bean类的字段上绑定转换器
在你用来映射CSV的Bean类中,给需要处理的字段添加@CsvCustomConverter注解,指定我们刚才写的转换器:
import org.apache.commons.csv.bean.CsvBindByName; import org.apache.commons.csv.bean.CsvCustomConverter; public class YourBean { @CsvBindByName(column = "your_column_name") @CsvCustomConverter(converter = StringToNullConverter.class) private String yourField; // 其他字段、getter和setter省略 }
3. 构建CsvToBean并执行转换
接下来正常构建CsvToBean实例即可,转换器会自动处理指定字段的特定值:
import org.apache.commons.csv.CSVFormat; import org.apache.commons.csv.bean.CsvToBean; import org.apache.commons.csv.bean.CsvToBeanBuilder; import java.io.Reader; import java.nio.file.Files; import java.nio.file.Paths; import java.util.List; public class CsvProcessor { public static void main(String[] args) throws Exception { try (Reader reader = Files.newBufferedReader(Paths.get("your_csv_file.csv"))) { CsvToBean<YourBean> csvToBean = new CsvToBeanBuilder<YourBean>(reader) .withType(YourBean.class) .withFormat(CSVFormat.DEFAULT.withHeader()) // 如果你还有需要处理的缺失字段,依然可以保留这个配置 .withFieldAsNull(CSVReaderNullFieldIndicator.EMPTY_SEPARATORS) .build(); List<YourBean> beans = csvToBean.parse(); // 处理转换后的Bean列表 } } }
这样一来,CSV中所有匹配"-"的字段值都会被转换成null,完美解决你的需求~
内容的提问来源于stack exchange,提问作者steve dunning
相关产品推荐
相关产品推荐

