Mule - 如何使用额外的分隔符填充CSV文件中的行

时间:2014-04-23 14:03:33

标签: csv append mule delimiter mule-studio

我的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>

2 个答案:

答案 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文件,写入另一个文件,并根据每行末尾的逻辑添加,