使用 Azure Logic App 跳过存储在 SFTP 中的 CSV 中的第一行和最后 x 行

Skip first and last x rows in CSV stored in SFTP using Azure Logic App

我有一个使用 2 个 Compose 的逻辑应用程序,第一个跳过前 3 行

take(skip(variables('CSV Data'),3),sub(length(variables('CSV Data')),1))

第二个跳过最后两行

take(outputs('Skip_Header'),sub(length(outputs('Skip_Header')),2))

当我用数组初始化 CSV 数据变量时,这非常有效

[
  "rubbish1,rubbish2,rubbish3",
  "blank1,blank2,blank3",
  "header1,header2,header3",
  "data1,data2,data3",
  "data4,data5,data6",
  "data7,data8,data9"
]

下面是我的工作逻辑应用程序定义:

{
    "definition": {
        "$schema": "https://schema.management.azure.com/providers/Microsoft.Logic/schemas/2016-06-01/workflowdefinition.json#",
        "actions": {
            "Initialize_CSV_Data": {
                "inputs": {
                    "variables": [
                        {
                            "name": "CSV Data",
                            "type": "array",
                            "value": [
                                "rubbish1,rubbish2,rubbish3",
                                "blank1,blank2,blank3",
                                "header1,header2,header3",
                                "data1,data2,data3",
                                "data4,data5,data6",
                                "data7,data8,data9"
                            ]
                        }
                    ]
                },
                "runAfter": {},
                "type": "InitializeVariable"
            },
            "Skip_Footer": {
                "inputs": "@take(outputs('Skip_Header'),sub(length(outputs('Skip_Header')),2))",
                "runAfter": {
                    "Skip_Header": [
                        "Succeeded"
                    ]
                },
                "type": "Compose"
            },
            "Skip_Header": {
                "inputs": "@take(skip(variables('CSV Data'),3),sub(length(variables('CSV Data')),1))",
                "runAfter": {
                    "Initialize_CSV_Data": [
                        "Succeeded"
                    ]
                },
                "type": "Compose"
            }
        },
        "contentVersion": "1.0.0.0",
        "outputs": {},
        "parameters": {},
        "triggers": {
            "manual": {
                "inputs": {},
                "kind": "Http",
                "type": "Request"
            }
        }
    },
    "parameters": {}
}

但这只是为了测试,因为实际上数据实际上是以 CSV 格式存储在 SFTP 中的,所以如果我从数组

更改初始化变量
[
  "rubbish1,rubbish2,rubbish3",
  "blank1,blank2,blank3",
  "header1,header2,header3",
  "data1,data2,data3",
  "data4,data5,data6",
  "data7,data8,data9"
]

到字符串

rubbish1,rubbish2,rubbish3
blank1,blank2,blank3
header1,header2,header3
data1,data2,data3
data4,data5,data6
data7,data8,data9

那将更真实地反映我的实际情况。但是逻辑应用程序现在所做的是只忽略前 3 个字符和后 2 个字符,而不是前 3 行和后 2 行。新定义如下:

{
    "definition": {
        "$schema": "https://schema.management.azure.com/providers/Microsoft.Logic/schemas/2016-06-01/workflowdefinition.json#",
        "actions": {
            "Initialize_CSV_Data": {
                "inputs": {
                    "variables": [
                        {
                            "name": "CSV Data",
                            "type": "string",
                            "value": "rubbish1,rubbish2,rubbish3\nblank1,blank2,blank3\nheader1,header2,header3\ndata1,data2,data3\ndata4,data5,data6\ndata7,data8,data9"
                        }
                    ]
                },
                "runAfter": {},
                "type": "InitializeVariable"
            },
            "Skip_Footer": {
                "inputs": "@take(outputs('Skip_Header'),sub(length(outputs('Skip_Header')),2))",
                "runAfter": {
                    "Skip_Header": [
                        "Succeeded"
                    ]
                },
                "type": "Compose"
            },
            "Skip_Header": {
                "inputs": "@take(skip(variables('CSV Data'),3),sub(length(variables('CSV Data')),1))",
                "runAfter": {
                    "Initialize_CSV_Data": [
                        "Succeeded"
                    ]
                },
                "type": "Compose"
            }
        },
        "contentVersion": "1.0.0.0",
        "outputs": {},
        "parameters": {},
        "triggers": {
            "manual": {
                "inputs": {},
                "kind": "Http",
                "type": "Request"
            }
        }
    },
    "parameters": {}
}

下面的屏幕截图也显示了 2 个逻辑应用程序之间的区别,除了“初始化 CSV 数据”之外,其他都一样:

考虑到您提供的相同示例,我使用 3 个组合连接器来跳过第一行。这是我的逻辑应用程序

我正在使用 Split To Get Rows 连接器将 csv 文件转换为数组。下面是里面的表达式

split(body('Get_blob_content_(V2)'),'

')

上述步骤创建了一个额外的空数组对象,为了将其删除,我将使用下一步 Rows Array 连接器。下面是里面的表达式

take(outputs('Split_To_Get_Rows'),sub(length(outputs('Split_To_Get_Rows')),1))

进一步 Skip First Number of Rows 连接器用于跳过前 3 行。这是其中的表达式

take(skip(outputs('Rows_Array'),3),sub(length(outputs('Rows_Array')),1))

这是最终结果:

更新的答案


要删除 x 行页脚,则表达式为

take(outputs('Skip_First_Number_Of_Rows_(Header)'),length(skip(outputs('Skip_First_Number_Of_Rows_(Header)'),0)))

将以下内容视为数组:-

[
rubbish1,rubbish2,rubbish3
blank1,blank2,blank3
header1,header2,header3
data1,data2,data3
sample1,sample2,sample3
data4,data5,data6
rubbish4,rubbish5,rubbish6
footer1,footer2,footer3
]

那么这是上述表达式的结果

如果您需要从下方跳过 2 行,则表达式为

take(outputs('Skip_First_Number_Of_Rows_(Header)'),length(skip(outputs('Skip_First_Number_Of_Rows_(Header)'),1)))

这就是结果