我的Mule应用程序中有一个CSV文件,如下所示:
1,Item,Item,Item
2,Field,Field,Field,Field
2,Field,Field,Field,Field
3,Text
有没有办法可以将Mule中的这个文件转换为如下所示:
1,Item,Item,Item,,,,,,
2,Field,Field,Field,Field,,,,,
2,Field,Field,Field,Field,,,,,
3,Text,,,,,,,,
基本上,我需要做的是在每行的末尾添加一个字符串(包含x个分隔符)。我需要附加到每一行的分隔符的数量可以由该行的第一个字符确定,例如if row[0]='1' then (append ",,,,,,") else if row[0]='2' then (append ",,,,,"
等
我有这个相当讨厌的问题的原因是因为向我的Mule应用程序提供输入的系统产生一个文件,其中每行中的列数可能不同。我正在尝试填充此文件,以便每行中的列数相等,以便我可以将其传递给Java变换器,如使用FlatPack解释的那个here(期望 x 列,它不接受每行中具有不同列数的文件。)
有没有人对如何处理此问题有任何想法?提前谢谢。
更新
基于@Learner的推荐和@ EdC的回答 - 我使用以下内容在Mule中实现了这一点:
<flow name="testFlow1" doc:name="testFlow1">
<file:inbound-endpoint .../>
<file:file-to-string-transformer doc:name="File to String"/>
<component doc:name="Java" class="package.etc.etc.MalformData"/>
</flow>
答案 0 :(得分:2)
根据@Learner的回答试试这个。
import org.mule.api.MuleEventContext;
import org.mule.api.MuleMessage;
public class MalformData implements org.mule.api.lifecycle.Callable {
private String[] strTempArray;
public String findMalformRow(String strInput) {
String strOutput = "";
String strFix = "";
int intArrayLength = 0;
char charFirst = ' ';
String strControl = "";
strTempArray = strInput.split("\\n");
intArrayLength = strTempArray.length;
for (int i = 0; i < intArrayLength; i++) {
charFirst = strTempArray[i].charAt(0);
strFix = strTempArray[i];
String missingDelimiter = "";
if (charFirst == '1') {
missingDelimiter = ",,,,,,";
strFix += missingDelimiter;
} else if (charFirst == '2') {
missingDelimiter = ",,,,,";
strFix += missingDelimiter;
} else if (charFirst == '3') {
missingDelimiter = ",,,,,,,,";
strFix += missingDelimiter;
} else {
strFix = "Good";
}
if (strControl != "Good") {
strTempArray[i] = strFix;
} else {
charFirst = ' ';
strFix = "";
}
}
for(int i=0; i < intArrayLength; i++){
strOutput += strTempArray[i] + "\n";
}
return strOutput;
}
@Override
public Object onCall(MuleEventContext eventContext) throws Exception {
MuleMessage message = eventContext.getMessage();
String newPayload = this.findMalformRow(message.getPayloadAsString());
message.setPayload(newPayload);
return message;
}
}
答案 1 :(得分:1)
您可以编写一个自定义java组件,逐行读取CSV文件,写入另一个文件,并根据每行末尾的逻辑添加,