Große CSVs mit Powerautomate in Sharepoint oder Excel übertragen


 

Nachdem ich im April 2022 bei BDO Austria als
Backoffice Assistant in der IT gestartet habe, habe ich viel Freiraum
und Gelegenheit erhalten mich mit den Neuerungen von Microsoft
auseinander zu setzen. Schließlich war meine Ausbildung zur IT
Technikerin schon schon mehr als 10 Jahre her und ich habe nur in
relativ einfachen Call Center Support Jobs gearbeitet.

Insbesondere angetan hat es mir Powerautomate. Und zuletzt die
Erfassung von CSV Files aus E-Mails in Sharepoint und Excel. Da BMD beim
Export zwar auch .xlsx anbietet allerdings ohne Tabellenformatierung,
war der Export als .csv sinnvoller.

Kommen wir nun also zu meinem Beispielflow und wie ich .csv mit mehr als 5000 Zeilen verarbeite.

Unser Triggerevent ist der Eingang der E-Mail mit dem
Betreff: Ressourcenverleih IT: Ressourcenart Geräte alle Kategorien
Verleih

Direkt im Anschluss initialisieren wir mehrere Array Variablen (wie viele hängt auch von der erwarteten Größe der CSV ab.

Wir erwarten knapp über 5000 Zeilen. Daher brauchen wir 3
Variablen. Eine für das gesamte Array dass wir nachher definieren und 2
weitere um diese Array zu teilen.

Diese E-Mail enthält unser .csv File. Den Inhalt erfassen wir mit einer Compose Action:

base64ToString(item()?[‘contentBytes’])

Gefolgt von einer weiteren Compose Action, die die neue Zeile
definiert. Dafür einfach nur in der Compose Action einmal Enter drücken.

Nun befüllen wir unsere Variablen.

Unsere erstes Array bekommt die Information mit wie sie die CSV erfassen muss:

skip(split(outputs(‘Verfassen’),outputs(‘Verfassen_1’)),1)

Wobei Verfassen hier die vorhin konvertierte CSV ist und Verfassen1 die neue Zeile.

So sagen wir dem Array überspringe die erste Zeile (da es sich
hier um die Spaltennamen handelt) und nutze als Trenner die neue Zeile.

Nun weiß ich aus Erfahrung, dass mein Array häufig mehr als 5000
Zeilen haben wird und die folgende For each Aktion die meine CSV in
meinem Fall in eine Sharepointliste schreiben soll, erlaubt nicht mehr
als 5000 Durchläufe.

Daher teilen wir das Array nun auf.

Für meinen Fall empfiehlt sich die Teilung in ungefähr gleich große Teile. Daher teilen wir bei 3000 Zeilen.

Dafür brauchen wir die beiden anderen Variablen.

Wir befüllen die Variable “Teil1” mit dem folgenden Inhalt:

take(variables(‘Test’), 3000)

Damit nehmen wir uns die ersten 3000 Zeilen.

Und nun schreiben wir in die Variable “Teil2” folgendes:

skip(variables(‘Test’),3000)

Damit überspringen wir die ersten 3000 Zeilen.

Nun haben wir also statt einem Array mit bis zu 6000 Zeilen 2 Arrays mit jeweils 3000 Zeilen.

Diese können wir nun in je einer For each Action in unsere
Sharepointliste oder in ein Excel schreiben bzw. was immer wir noch
damit anstellen wollen.

Um den Grenzwert von 10000 Aktionen pro Flow nicht zu
überschreiben kann man diese Variante auch nutzen und 2 oder mehr Flows
schreiben in der jeder Flow einen Teil der Daten verarbeitet.

Ist die Anzahl der zu erwarteten Zeilen unbekannt, könnt ihr
natürlich noch mehr Variablen initialisieren und die Teilung immer bei
5000 vornehmen. Variablen die keinen Inhalt mehr liefern werden im Flow
einfach übersprungen.

So das war mein erster Beitrag zu dem Thema.

Beim nächsten Mal schauen wir uns an wie wir damit umgehen wenn
das Ergebnis der Zeilen unbekannt ist und wir daher mit verschachtelten
“For each” Aktionen arbeiten müssen sowie der “Repeat until” Aktion.


Leave a Reply

Your email address will not be published. Required fields are marked *