使用 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)))
这就是结果
我有一个使用 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)))
这就是结果