Spring til indholdet

Læs en CSV-fil ind i en SharePoint-liste med Power Automate

En CSV-fil lagt i et dokumentbibliotek bliver til listeelementer — én række ad gangen — med split, skip og Parse JSON og uden premiumhandlinger.

Opdateret Power AutomateSharePoint Online 2 min. læsning

Power Automate har ingen handling, der læser en CSV-fil. Filens indhold er bare tekst, så den kan deles op i linjer og felter med udtryk, og hver linje kan blive til et element på en liste. Det kræver kun standardhandlinger.

Opsætning#

  1. Et dokumentbibliotek, fx CSVDropoff, hvor filerne lægges. Det får en valgkolonne Status med værdierne Ny, I gang og Færdig.
  2. En liste, fx CSVTasks, hvor rækkerne ender. Den får en kolonne for hvert felt i filen.

Flowet#

Flowet starter, når der kommer en fil i biblioteket, og henter filens indhold med Get file content. Resten er en række Compose-handlinger, hvis navne går igen i udtrykkene.

CSV gør indholdet til tekst:

trim(base64ToString(outputs('Get_file_content')?['body']['$content']))

Newline er et linjeskift. Det skrives ved at trykke Enter i feltet, eller som udtryk:

decodeUriComponent('%0A')

SplitNewLine deler teksten op i linjer:

split(outputs('CSV'),outputs('Newline'))

CSVData springer overskriftslinjen over:

skip(outputs('SplitNewLine'),1)

Derefter en Apply to each over @{outputs('CSVData')}. Inde i løkken deler SplitBySemiColon linjen op i felter:

split(Item(),';')

JSON bygger et objekt af felterne:

{
  "ISIN": "@{outputs('SplitBySemiColon')?[0]}",
  "SecuritiesAccountNumber": "@{outputs('SplitBySemiColon')?[1]}",
  "Paydate": "@{outputs('SplitBySemiColon')?[2]}",
  "QuantityOfShares": "@{outputs('SplitBySemiColon')?[3]}",
  "DividendCurrency": "@{outputs('SplitBySemiColon')?[4]}",
  "GrossAmount": "@{outputs('SplitBySemiColon')?[5]}",
  "TaxRate%": "@{outputs('SplitBySemiColon')?[6]}",
  "TaxAmount": "@{outputs('SplitBySemiColon')?[7]}",
  "NetAmount": "@{outputs('SplitBySemiColon')?[8]}"
}

Parse JSON (her kaldet CompleteJSON) tager @{outputs('JSON')} med dette skema:

{
  "type": "object",
  "properties": {
    "ISIN": { "type": "string" },
    "SecuritiesAccountNumber": { "type": "string" },
    "Paydate": { "type": "string" },
    "QuantityOfShares": { "type": "string" },
    "GrossAmount": { "type": "string" },
    "DividendCurrency": { "type": "string" },
    "TaxRate%": { "type": "string" },
    "TaxAmount": { "type": "string" },
    "NetAmount": { "type": "string" }
  }
}

Til sidst opretter Create item elementet på listen, med felterne fra Parse JSON:

@{body('CompleteJSON')?['ISIN']}

Når løkken er færdig, sætter en Update file properties filens Status til Færdig.

Det der driller#

  • Windows-filer slutter linjerne med \r\n. Deles der kun på \n, hænger \r på det sidste felt i hver linje. Sæt trim() om det sidste felt, eller del på decodeUriComponent('%0D%0A').
  • En tom sidste linje giver et tomt element. trim() på hele indholdet fjerner den, og ellers kan en Filter array på length(item()) større end 0 luge den ud før løkken.
  • Semikolon i et felt ødelægger opdelingen. split kender ikke til anførselstegn, så en fil med tekstfelter i citationstegn og semikolon indeni skal renses først.
  • Alt er tekst. Skemaet siger string hele vejen. Tal og datoer omformes i Create item med float() og formatDateTime(), og et decimalkomma skal byttes til punktum først.
  • base64ToString er kun nødvendig, når indholdet kommer som base64. Returnerer Get file content allerede teksten, fejler udtrykket, og så er outputs('Get_file_content')?['body'] nok.

Alle noter