如何使用 Spring Batch 解析 CSV(值包含逗号)
How to parse CSV(with values containing commas) with Spring Batch
我想像这样解析一行:
"A", "aa,bb", ,"aa"
进入这些代币:
A | aa,bb | (empty string) | aa
FileItemReader 的定义是什么样的?我想我需要自己的 DelimitedLineTokenizer?
谢谢
检查这个例子http://www.mkyong.com/spring-batch/spring-batch-hello-world-example/
如果逗号将成为分隔符,则您无需创建自己的 DelimitedLineTokenizer。
您可以使用 "org.springframework.batch.item.file.transform.DelimitedLineTokenizer"
DelimitedLineTokenizer 应该可以解析逗号或竖线。如果您正在考虑读取逗号分隔的文件并将其转换为管道分隔的文件,则需要丰富您的项目(在处理器中)然后持久化它。
甚至我也遇到过同样的情况,其中一个包含逗号的文本被滑到了一个新的单元格中。我更改了 XML 并添加了一个 CustomDelimitedLineAggregator。
例如 :) 我的 XML 将具有以下代码:-
<property name="lineAggregator">
<bean
class="com.CustomDelimitedLineAggregator">
<property name="delimiter" value="|" />
<property name="fieldExtractor">
<bean
class="org.springframework.batch.item.file.transform.BeanWrapperFieldExtractor">
<property name="names"
value="entityHashKey,entityLocationClli,entityLocationName,entityLocationType,entitySCISCode,entityStateCode,entityCountryCode,entityRegion" />
</bean>
</property>
</bean>
</property>
</bean>
还创建了自定义 class(即 CustomDelimitedLineAggregator.java),如下所示:-
包 com;
进口org.springframework.batch.item.file.transform.ExtractorLineAggregator;
导入 org.springframework.util.StringUtils;
public class CustomDelimitedLineAggregator 扩展了 ExtractorLineAggregator {
私有字符串定界符;
public CustomDelimitedLineAggregator() {
this.delimiter = ",";
}
public void setDelimiter(String delimiter) {
this.delimiter = delimiter;
}
@Override
public String doAggregate(Object[] fields) {
String arrregateVal = StringUtils.arrayToDelimitedString(fields, this.delimiter);
if(null != arrregateVal && arrregateVal.contains(","))
{
arrregateVal = "\""+arrregateVal+"\"";
}
return arrregateVal;
}
}
在doAggregate
方法中,每一行的完整数据即将到来,如果任何行包含逗号,它将把整行放在里面(即双引号)“我的包含逗号的完整行数据”因此,即使其中包含逗号,整行也将位于一行中。
我想像这样解析一行:
"A", "aa,bb", ,"aa"
进入这些代币:
A | aa,bb | (empty string) | aa
FileItemReader 的定义是什么样的?我想我需要自己的 DelimitedLineTokenizer?
谢谢
检查这个例子http://www.mkyong.com/spring-batch/spring-batch-hello-world-example/
如果逗号将成为分隔符,则您无需创建自己的 DelimitedLineTokenizer。 您可以使用 "org.springframework.batch.item.file.transform.DelimitedLineTokenizer"
DelimitedLineTokenizer 应该可以解析逗号或竖线。如果您正在考虑读取逗号分隔的文件并将其转换为管道分隔的文件,则需要丰富您的项目(在处理器中)然后持久化它。
甚至我也遇到过同样的情况,其中一个包含逗号的文本被滑到了一个新的单元格中。我更改了 XML 并添加了一个 CustomDelimitedLineAggregator。
例如 :) 我的 XML 将具有以下代码:-
<property name="lineAggregator">
<bean
class="com.CustomDelimitedLineAggregator">
<property name="delimiter" value="|" />
<property name="fieldExtractor">
<bean
class="org.springframework.batch.item.file.transform.BeanWrapperFieldExtractor">
<property name="names"
value="entityHashKey,entityLocationClli,entityLocationName,entityLocationType,entitySCISCode,entityStateCode,entityCountryCode,entityRegion" />
</bean>
</property>
</bean>
</property>
</bean>
还创建了自定义 class(即 CustomDelimitedLineAggregator.java),如下所示:-
包 com;
进口org.springframework.batch.item.file.transform.ExtractorLineAggregator; 导入 org.springframework.util.StringUtils;
public class CustomDelimitedLineAggregator 扩展了 ExtractorLineAggregator { 私有字符串定界符;
public CustomDelimitedLineAggregator() {
this.delimiter = ",";
}
public void setDelimiter(String delimiter) {
this.delimiter = delimiter;
}
@Override
public String doAggregate(Object[] fields) {
String arrregateVal = StringUtils.arrayToDelimitedString(fields, this.delimiter);
if(null != arrregateVal && arrregateVal.contains(","))
{
arrregateVal = "\""+arrregateVal+"\"";
}
return arrregateVal;
}
}
在doAggregate
方法中,每一行的完整数据即将到来,如果任何行包含逗号,它将把整行放在里面(即双引号)“我的包含逗号的完整行数据”因此,即使其中包含逗号,整行也将位于一行中。