gpt4 book ai didi

java - 平面文件解析: when some fields contain the delimiter

转载 作者:行者123 更新时间:2023-12-02 04:44:06 28 4
gpt4 key购买 nike

我有一个 spring-batch 应用程序,可以使用此阅读器读取文件:

<bean id="tradeItemReader" class="org.springframework.batch.item.file.FlatFileItemReader" scope="step">
<property name="resource">
<bean class="org.springframework.core.io.FileSystemResource">
<constructor-arg value="${input.file.path}/#{jobExecutionContext['trades']}" type="java.lang.String"/>
</bean>
</property>
<property name="linesToSkip" value="1" />
<property name="lineMapper">
<bean class="org.springframework.batch.item.file.mapping.DefaultLineMapper">
<!-- split it -->
<property name="lineTokenizer">
<bean
class="org.springframework.batch.item.file.transform.DelimitedLineTokenizer">
<beans:property name="strict" value="false" />
<beans:property name="includedFields" value="0,2,3,6" />
<property name="names"
value="field0,field2,field3,field6" />
</bean>
</property>
<property name="fieldSetMapper">
<bean
class="org.springframework.batch.item.file.mapping.BeanWrapperFieldSetMapper">
<property name="prototypeBeanName" value="trade" />
</bean>
</property>
</bean>
</property>
</bean>

这些字段由逗号 , 分隔,这里有一个问题:有些字段看起来像 [LON, TGT] 并且该行最终被错误地解析,因为方括号内的逗号。

示例:

输入:Global,,VERIFIED,[LON, TGT],ERerd,3456585,QTR,20190929,20231020

所需输出:GlobalVERIFIED[LON、TGT]QTR

实际输出:GlobalVERIFIED[LON3456585

我怎样才能做到这一点?我无法控制输入文件。

编辑

这不是重复的,因为建议的解决方案不起作用:这里我们没有单引号字符,但我们有 2 个不同的字符,即左括号和右括号。

最佳答案

正如 Luca Basso Ricci 所解释的,我输入的 csv 无效,但我仍然必须处理它,因为我无法控制它。

因此,我编写了自己的定界行标记生成器,它只是带有重写的 isDelimiter() 方法的 DelimitedLineTokenizer ,并将其替换在 conf 文件中:

  private boolean isDelimiter(char[] chars, int i, String token, int endIndexLastDelimiter) {
boolean result = false;

int openingBrackets = StringUtils.countOccurrencesOf(new String(Arrays.copyOfRange(chars, 0, i)), "[");
int closingBrackets = StringUtils.countOccurrencesOf(new String(Arrays.copyOfRange(chars, 0, i)), "]");

boolean inBrackets = (openingBrackets - closingBrackets > 0);

if ((i - endIndexLastDelimiter >= this.delimiter.length()) &&
(i >= token.length() - 1)) {
String end = new String(chars, i - token.length() + 1, token.length());
if (token.equals(end)) {
result = !inBrackets;
}
}
return result;
}

关于java - 平面文件解析: when some fields contain the delimiter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56497324/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com