【问题标题】:Mule 4 - How do I process a non-standard CSV file (row by row)Mule 4 - 如何处理非标准 CSV 文件(逐行)
【发布时间】:2020-03-01 04:38:20
【问题描述】:

传统的 CSV 文件将包含所有具有相同列的行和一个可选的标题行,但是在这种情况下,我需要处理一个看起来不标准的 CSV,因为它有一个“标题”行,其中包含5 列,后跟数量不详的“正文”行,每行包含大约 15 列(与标题行无关),最后是包含 4 列的“页脚”行。

看起来整个文件都代表一个对象,如下所示:

headerValue1,headerValue2,headerValue3,headerValue4,headerValue5
bodyvalue1,bodyvalue2,bodyvalue3,bodyvalue4,bodyvalue5,bodyvalue6,bodyvalue7,bodyvalue8,bodyvalue9
bodyvalue1,bodyvalue2,bodyvalue3,bodyvalue4,bodyvalue5,bodyvalue6,bodyvalue7,bodyvalue8,bodyvalue9
footervalue1,footervalue2,footervalue3,footervalue4

我需要将其转换为 JSON 格式,因此一直在尝试使用 for 循环将 CSV 值设置为对象数组,但没有运气(没有有用的代码可发布)。带有 header 和没有 in mule 的 CSV 格式似乎都不起作用,因为它似乎期望每列都包含相同的字段类型,但它们没有。

还尝试为其定义平面文件架构,但也没有运气(可能是由于我在该领域的知识有限)。

所以我的问题是如何正确或有效地将这些 CSV 数据传递到可用的数组或对象中,或者甚至直接转换为 JSON 格式?

【问题讨论】:

    标签: csv mule anypoint-studio dataweave


    【解决方案1】:

    DataWeave 处理这种情况。未命名的列有一个通用的列名('columns_N')。对于example see the documentation。直接有效载荷转换(即“有效载荷”)有效。

    DataWeave 示例:

        ... set the csv into the payload and be sure its MIME type is to application/csv...
        <ee:transform doc:name="Transform Message">
            <ee:message >
                <ee:set-payload ><![CDATA[%dw 2.0
                    output application/json
                    ---
                    payload]]>
                </ee:set-payload>
            </ee:message>
        </ee:transform>
    

    输出:

    [
      {
        "headerValue1": "bodyvalue1",
        "headerValue2": "bodyvalue2",
        "headerValue3": "bodyvalue3",
        "headerValue4": "bodyvalue4",
        "headerValue5": "bodyvalue5",
        "column_5": "bodyvalue6",
        "column_6": "bodyvalue7",
        "column_7": "bodyvalue8",
        "column_8": "bodyvalue9"
      },
      {
        "headerValue1": "bodyvalue1",
        "headerValue2": "bodyvalue2",
        "headerValue3": "bodyvalue3",
        "headerValue4": "bodyvalue4",
        "headerValue5": "bodyvalue5",
        "column_5": "bodyvalue6",
        "column_6": "bodyvalue7",
        "column_7": "bodyvalue8",
        "column_8": "bodyvalue9"
      },
      {
        "headerValue1": "footervalue1",
        "headerValue2": "footervalue2",
        "headerValue3": "footervalue3",
        "headerValue4": "footervalue4"
      }
    ]
    

    【讨论】:

      【解决方案2】:

      如果我理解正确,您的文件是由标题、数据/正文、页脚组成的平面文件结构,其中每个记录/段都是分隔记录。 Mule 的平面文件阅读器将无法工作,因为它只能支持固定宽度的记录。您可以做的是将每组记录分成字符串,然后将每条记录读取为 csv。我可以在两个转换步骤中做到这一点,Transform 1 - 读取文件并将有效负载解析为字符串数组,Transform 2 - 将字符串数组转换为正确的 json 格式。请注意,可能存在性能问题(如果您的平面文件太大),因为它将有效负载作为字符串保存在内存中。

      流程:

      变换 1:

      %dw 2.0
      output application/java
      ---
      payload splitBy "\r\n"
      

      变换 2:

      %dw 2.0
      output application/json
      
      var sizePayload = sizeOf(payload)
      ---
      {
          header: read(payload[0], "application/csv", {"header" : false})[0],
          body: read(payload[1 to sizePayload-2] joinBy "\n", "application/csv", {"header" : false}),
          footer: read(payload[sizePayload-1], "application/csv", {"header" : false})[0],
      }
      

      给定下面的示例文件:

      headerValue1,headerValue2,headerValue3,headerValue4,headerValue5
      bodyvalue1,bodyvalue2,bodyvalue3,bodyvalue4,bodyvalue5,bodyvalue6,bodyvalue7,bodyvalue8,bodyvalue9
      bodyvalue12ndRow,bodyvalue2,bodyvalue3,bodyvalue4,bodyvalue5,bodyvalue6,bodyvalue7,bodyvalue8,bodyvalue92ndRow
      footervalue1,footervalue2,footervalue3,footervalue4
      

      这将导致下面的json:

      {
        "header": {
          "column_0": "headerValue1",
          "column_1": "headerValue2",
          "column_2": "headerValue3",
          "column_3": "headerValue4",
          "column_4": "headerValue5"
        },
        "body": [
          {
            "column_0": "bodyvalue1",
            "column_1": "bodyvalue2",
            "column_2": "bodyvalue3",
            "column_3": "bodyvalue4",
            "column_4": "bodyvalue5",
            "column_5": "bodyvalue6",
            "column_6": "bodyvalue7",
            "column_7": "bodyvalue8",
            "column_8": "bodyvalue9"
          },
          {
            "column_0": "bodyvalue12ndRow",
            "column_1": "bodyvalue2",
            "column_2": "bodyvalue3",
            "column_3": "bodyvalue4",
            "column_4": "bodyvalue5",
            "column_5": "bodyvalue6",
            "column_6": "bodyvalue7",
            "column_7": "bodyvalue8",
            "column_8": "bodyvalue92ndRow"
          }
        ],
        "footer": {
          "column_0": "footervalue1",
          "column_1": "footervalue2",
          "column_2": "footervalue3",
          "column_3": "footervalue4"
        }
      }
      

      【讨论】:

        猜你喜欢
        • 2018-01-18
        • 2015-06-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-28
        • 2013-05-16
        • 1970-01-01
        相关资源
        最近更新 更多