cancel
Showing results for 
Search instead for 
Did you mean: 
Reply
Anonymous
Not applicable

Split string using comma delimiter but ignore text within quotation marks? (line by line / Cloud Flow)

Hi all,

 

I've got a CSV file I'm trying to work through line by line by converting it to an array and then pass the data through to our database if it meets certain criteria but frustratingly, all of the lines have quote marks as they're supposed to be strings and they all have commas in which is causing me havoc. Please see below for a test case of the data.

 

 

[
"AAB,\"X, Y, Z, XX, YY, ZZ\",HK49,8501943,?,black,ink,,305,TBD-RD40,1.99,395",
"ABC,,ACR110,900438,???,colour,ink,,313,TBA-HK19,1.99,401",
]

 

This is my information after it's been loaded up initially and then when I apply by each and go through it line by line using a split ( @{split(item(), ',')} ) I'm getting the below output.

 

 

[
"AAB",
"\"X",
"Y",
"Z",
"XX",
"YY", 
"ZZ\"",
"HK49",
"8501943",
"?",
"black",
"ink",
"",
"305",
"TBD-RD40",
"1.99",
"395"
]

 

 

This is causing me so many problems as I can't figure out a way to account for the text within the quote marks and simply ignore it. I'm trying to achieve the following output but I've got absolutely no idea how to go about it:

 

 

[
"AAB",
"\"X, Y, Z, XX, YY, ZZ\"",
"HK49",
"8501943",
"?",
"black",
"ink",
"",
"305",
"TBD-RD40",
"1.99",
"395"
]

 

I would be extremely appreciative if I could have some input on this as I've been scratching my head since yesterday trying to think of ways around this.

 

If there's anything I can do to assist I would be more than willing (within the realms of data security for my company)

3 REPLIES 3

Hi, @Anonymous, this has actually come up a fair bit, matey. Take a look at the 'Recommendations' on the right there, and do a couple of searches in this forum on: CSV array

 

You're bound to find the answer you need.

 

In the meantime, I'll take a pop, as I might have a solution for this built already.

 

Suffice to say, maybe try to start with the headers, and see where you progress from there. I am assuming that you're wanting to make an object for each row with the headers as key names, and the respective column values as ... values. Starting at the top will help you build your logic.

 

Also, I assume that to get your current array of items all on one line, you're splitting your data on new lines, right?

 

Oh! and please edit into you original question either the source CSV data (how it looks in the CSV) or an example set of it.

 

Some CSVs are formatted with speech marks for every column item (which is wise for additional commas), so it may also be a thing.

 

Lastly, if you're OK with the privacy element (I'm pretty sure it's fine) then the Parse CSV action in the Plumsail connector is super useful here. 👍

takolota
Multi Super User
Multi Super User

@Anonymous & @eliotcole 

 

You can try this CSV to Dataset template for this

https://powerusers.microsoft.com/t5/Power-Automate-Cookbook/CSV-to-Dataset/td-p/1508191

Hi, @Anonymous, hopefully you found a solution, but if not, the following may suffice. You can also add a third Select to further mess with this using xml() & XPath() commands, however this will allow you to iterate over each unknown column.

 

I made a bit more sample data, just to ensure it caters for any speech-marks inside a cell, and that's in this spoiler.

Spoiler
AAB,"X, Y, Z, XX, YY, ZZ",HK49,8501943,?,black,ink,,305,TBD-RD40,1.99,395
ABC,"X, Y, Z, XX, YY, ZZ",1.99,8501944,?,black,ink,,305,TBD-RD40,1.99,395
ABA,"X, Y, ""Z"", XX, YY, ZZ",HK49,8501945,?,black,ink,,305,TBD-RD40,1.89,423
AAB,"X, Y, Z, XX, YY, ZZ",HK49,8501946,?,black,ink,,305,TBD-RD40,1.99,395

Right ... onward!

 

Two Selects and a Carriage Return

This will work as long as the only CSV formatting that is done is "" for double-quotes in a cell, and surrounding cells with commas in them in double quotes.

0 - The Flow.jpg

There's some long expressions in here, but they're not too scary, just some replace() actions and silly names I made up. 😉

 

cCNST

This is just a carriage return in a Compose action. It allows you to quickly reference new lines in strings throughout.

 

Select reDelimiting

This basically makes a mess. 😅

02 - Select reDelimiting.jpg
From:
split(
    replace(
        replace(
            replace(
                replace(
                    outputs('csvCNST'), 
                    '""', 
                    'dubQu0t£y'
                ), 
                ',"', 
                'DEL1MI73oSt@rtyWartF@acE'
            ), 
            '",', 
            'DEL1MI73o'
        ), 
        outputs('cCNST'), 
        'n3wR3c0rdI@'
    ), 
    'DEL1MI73o'
)
Map:
if(
    startsWith(
        item(), 
        'St@rtyWartF@acE'
    ), 
    replace(
        replace(
            item(), 
            ',', 
            'c00m@rR$'
        ), 
        'St@rtyWartF@acE', 
        ''
    ), 
    item()
)

Essentially this Select action exists to 'encode' a lot of stuff into something that won't ever be a string.

 

Explaining the From inside-out:

Spoiler
  1. replace() #1 - Encodes any speech marks internal to a cell to dubQu0t£y.
    Now there should only be speech marks where formatted cells start and end.

  2. replace() #2 - Encodes the starts of cells beginning with speech marks to DEL1MI73oSt@rtyWartF@acE.
    Now there should only be speech marks where formatted cells end.

  3. replace() #3 - Encodes the ends of cells ending with speech marks to DEL1MI73o.
    Now there should be no speech marks.

  4. replace() #4 - Encodes any new lines as n3wR3c0rdI@.
    Now the whole thing is just one line with lots of commas and an occasional weird coded word!

  5. split() - Makes an array wherever there is DEL1MI73o.
    Now there are distinct items which begin with St@rtyWartF@acE.

Explaining the Map, from inside the if() statement:

Spoiler
  1. startsWith() - This true/false check looks to see if the current item() which the Select is processing begins with St@rtyWartF@acE.

  2. true - If the item() starts with St@rtyWartF@acE it will remove it, and encode any commas.
    1. replace() #1 - Encodes any commas as c00m@rR$.
    2. replace() #2 - Removes St@rtyWartF@acE.

  3. false - If the item() doesn't start with that silly word, then this item() returns as normal.

 

Select arrayItems

This fixes the mess! 🤓

03 - Select itemArrays.jpg
From:
split(
    join(
        body('Select_reDelimiting'), 
        ','
    ), 
    'n3wR3c0rdI@'
)
Map:
json(
    concat(
        '["', 
        replace(
            replace(
                replace(
                    item(), 
                    ',', 
                    '","'
                ), 
                'c00m@rR$', 
                ','
            ), 
            'dubQu0t£y', 
            '\"'
        ), 
        '"]'
    )
)

Here the Select action exists to make an array out of the data on each line by using the json() converter function. This ensures that before it does so that it finally runs replace() functions on the previously placed commas and speech marks.

 

Explaining the From inside-out:

Spoiler
  1. join() - Joins all the items made by the previous Select action together with a comma.
    Now there should be a single line of text again, with some funny words.

  2. split() - Finds every instance where the previous Select had encoded a new record (new line) into and makes a new array entry.
    Now there should only array items for each line of the original CSV except the commas and double quotes from speech marked cells are still encoded.

Explaining the Map inside-out:

Spoiler
  1. replace() #1 - Swaps any commas for a comma between two speech marks.

  2. replace() #2 - Decodes any c00m@rR$ into commas.

  3. replace() #3 - Decodes any to dubQu0t£y into an escaped speech mark (\").
    Now this particular item() should be a single line of text, with values separated by ",".

  4. replace() #4 - Encodes any new lines as n3wR3c0rdI@.
    Now the whole item() is just one line with lots of commas and an occasional weird coded word!

  5. concat() - This places a [" at the start and a "] at the end of this line.
    Now the item() is an array, but it is still in string format.

  6. json() - Converts the whole thing into acceptible JSON which can be read by subsequent actions.

 

Resultant Data

In the below spoiler is what the data that came out of my flow when I ran this.

Spoiler
[
  [
    "AAB",
    "X, Y, Z, XX, YY, ZZ",
    "HK49",
    "8501943",
    "?",
    "black",
    "ink",
    "",
    "305",
    "TBD-RD40",
    "1.99",
    "395"
  ],
  [
    "ABC",
    "X, Y, Z, XX, YY, ZZ",
    "1.99",
    "8501944",
    "?",
    "black",
    "ink",
    "",
    "305",
    "TBD-RD40",
    "1.99",
    "395"
  ],
  [
    "ABA",
    "X, Y, \"Z\", XX, YY, ZZ",
    "HK49",
    "8501945",
    "?",
    "black",
    "ink",
    "",
    "305",
    "TBD-RD40",
    "1.89",
    "423"
  ],
  [
    "AAB",
    "X, Y, Z, XX, YY, ZZ",
    "HK49",
    "8501946",
    "?",
    "black",
    "ink",
    "",
    "305",
    "TBD-RD40",
    "1.99",
    "395"
  ]
]

 

Helpful resources

Announcements

Community will be READ ONLY July 16th, 5p PDT -July 22nd

Dear Community Members,   We'd like to let you know of an upcoming change to the community platform: starting July 16th, the platform will transition to a READ ONLY mode until July 22nd.   During this period, members will not be able to Kudo, Comment, or Reply to any posts.   On July 22nd, please be on the lookout for a message sent to the email address registered on your community profile. This email is crucial as it will contain your unique code and link to register for the new platform encompassing all of the communities.   What to Expect in the New Community: A more unified experience where all products, including Power Apps, Power Automate, Copilot Studio, and Power Pages, will be accessible from one community.Community Blogs that you can syndicate and link to for automatic updates. We appreciate your understanding and cooperation during this transition. Stay tuned for the exciting new features and a seamless community experience ahead!

Summer of Solutions | Week 4 Results | Winners will be posted on July 24th

We are excited to announce the Summer of Solutions Challenge!    This challenge is kicking off on Monday, June 17th and will run for (4) weeks.  The challenge is open to all Power Platform (Power Apps, Power Automate, Copilot Studio & Power Pages) community members. We invite you to participate in a quest to provide solutions to as many questions as you can. Answers can be provided in all the communities.    Entry Period: This Challenge will consist of four weekly Entry Periods as follows (each an “Entry Period”)   - 12:00 a.m. PT on June 17, 2024 – 11:59 p.m. PT on June 23, 2024 - 12:00 a.m. PT on June 24, 2024 – 11:59 p.m. PT on June 30, 2024 - 12:00 a.m. PT on July 1, 2024 – 11:59 p.m. PT on July 7, 2024 - 12:00 a.m. PT on July 8, 2024 – 11:59 p.m. PT on July 14, 2024   Entries will be eligible for the Entry Period in which they are received and will not carryover to subsequent weekly entry periods.  You must enter into each weekly Entry Period separately.   How to Enter: We invite you to participate in a quest to provide "Accepted Solutions" to as many questions as you can. Answers can be provided in all the communities. Users must provide a solution which can be an “Accepted Solution” in the Forums in all of the communities and there are no limits to the number of “Accepted Solutions” that a member can provide for entries in this challenge, but each entry must be substantially unique and different.    Winner Selection and Prizes: At the end of each week, we will list the top ten (10) Community users which will consist of: 5 Community Members & 5 Super Users and they will advance to the final drawing. We will post each week in the News & Announcements the top 10 Solution providers.  At the end of the challenge, we will add all of the top 10 weekly names and enter them into a random drawing.  Then we will randomly select ten (10) winners (5 Community Members & 5 Super Users) from among all eligible entrants received across all weekly Entry Periods to receive the prize listed below. If a winner declines, we will draw again at random for the next winner.  A user will only be able to win once overall. If they are drawn multiple times, another user will be drawn at random.  Individuals will be contacted before the announcement with the opportunity to claim or deny the prize.  Once all of the winners have been notified, we will post in the News & Announcements of each community with the list of winners.   Each winner will receive one (1) Pass to the Power Platform Conference in Las Vegas, Sep. 18-20, 2024 ($1800 value). NOTE: Prize is for conference attendance only and any other costs such as airfare, lodging, transportation, and food are the sole responsibility of the winner. Tickets are not transferable to any other party or to next year’s event.   ** PLEASE SEE THE ATTACHED RULES for this CHALLENGE**   Week 1 Results: Congratulations to the Week 1 qualifiers, you are being entered in the random drawing that will take place at the end of the challenge.   Community MembersNumber SolutionsSuper UsersNumber Solutions Deenuji 9 @NathanAlvares24  17 @Anil_g  7 @ManishSolanki  13 @eetuRobo  5 @David_MA  10 @VishnuReddy1997  5 @SpongYe  9JhonatanOB19932 (tie) @Nived_Nambiar  8 @maltie  2 (tie)   @PA-Noob  2 (tie)   @LukeMcG  2 (tie)   @tgut03  2 (tie)       Week 2 Results: Congratulations to the Week 2 qualifiers, you are being entered in the random drawing that will take place at the end of the challenge. Week 2: Community MembersSolutionsSuper UsersSolutionsPower Automate  @Deenuji  12@ManishSolanki 19 @Anil_g  10 @NathanAlvares24  17 @VishnuReddy1997  6 @Expiscornovus  10 @Tjan  5 @Nived_Nambiar  10 @eetuRobo  3 @SudeepGhatakNZ 8     Week 3 Results: Congratulations to the Week 3 qualifiers, you are being entered in the random drawing that will take place at the end of the challenge. Week 3:Community MembersSolutionsSuper UsersSolutionsPower Automate Deenuji32ManishSolanki55VishnuReddy199724NathanAlvares2444Anil_g22SudeepGhatakNZ40eetuRobo18Nived_Nambiar28Tjan8David_MA22   Week 4 Results: Congratulations to the Week 4 qualifiers, you are being entered in the random drawing that will take place at the end of the challenge. Week 4:Community MembersSolutionsSuper UsersSolutionsPower Automate Deenuji11FLMike31Sayan11ManishSolanki16VishnuReddy199710creativeopinion14Akshansh-Sharma3SudeepGhatakNZ7claudiovc2CFernandes5 misc2Nived_Nambiar5 Usernametwice232rzaneti5 eetuRobo2   Anil_g2   SharonS2  

Check Out | 2024 Release Wave 2 Plans for Microsoft Dynamics 365 and Microsoft Power Platform

On July 16, 2024, we published the 2024 release wave 2 plans for Microsoft Dynamics 365 and Microsoft Power Platform. These plans are a compilation of the new capabilities planned to be released between October 2024 to March 2025. This release introduces a wealth of new features designed to enhance customer understanding and improve overall user experience, showcasing our dedication to driving digital transformation for our customers and partners.    The upcoming wave is centered around utilizing advanced AI and Microsoft Copilot technologies to enhance user productivity and streamline operations across diverse business applications. These enhancements include intelligent automation, AI-powered insights, and immersive user experiences that are designed to break down barriers between data, insights, and individuals. Watch a summary of the release highlights.    Discover the latest features that empower organizations to operate more efficiently and adaptively. From AI-driven sales insights and customer service enhancements to predictive analytics in supply chain management and autonomous financial processes, the new capabilities enable businesses to proactively address challenges and capitalize on opportunities.    

Updates to Transitions in the Power Platform Communities

We're embarking on a journey to enhance your experience by transitioning to a new community platform. Our team has been diligently working to create a fresh community site, leveraging the very Dynamics 365 and Power Platform tools our community advocates for.  We started this journey with transitioning Copilot Studio forums and blogs in June. The move marks the beginning of a new chapter, and we're eager for you to be a part of it. The rest of the Power Platform product sites will be moving over this summer.   Stay tuned for more updates as we get closer to the launch. We can't wait to welcome you to our new community space, designed with you in mind. Let's connect, learn, and grow together.   Here's to new beginnings and endless possibilities!   If you have any questions, observations or concerns throughout this process please go to https://aka.ms/PPCommSupport.   To stay up to date on the latest details of this migration and other important Community updates subscribe to our News and Announcements forums: Copilot Studio, Power Apps, Power Automate, Power Pages

Users online (1,859)