Avatar billede _just4fun_ Nybegynder
31. oktober 2003 - 15:26 Der er 6 kommentarer og
1 løsning

delimiters og quallifiere i en tekst

Hej

Er der nogen nem måde hvor man kan parse en tekst op, så den kan importeres i en datatable?

Min tekst ser ud ala

12,23,"hej","en tekst","en ""anden"" tekst",12,34
13,45,"kjkljh","kjlkj","klæj,ups",33,45
... osv

Jeg ved at , er delimiter, og " er qualifyer, men jeg kan ikke være sikker på at nr. 1 altid er nummerisk, eller at nr. 3 altid er tekst. De kan altså vlre i en vilkårlig rækkefølge.

Jeg synes det virker dumt at skulle lave en algoritme til at parse teksten op, men kan ikke finde noget i .NET frameworket der gøt det!

Hjælp!
Avatar billede m_skau Nybegynder
31. oktober 2003 - 15:46 #1
Læs din tekst ind i en streng, og brug StringBuilder.Replace til at fjerne dine qualifiers

Split derefter strengen op i en array som herunder:

----------
using System;

public class StringSplit {
    public static void Main() {

        string delimStr = ",";
    char [] delimiter = delimStr.ToCharArray();
        string words = dintekst;
        string [] split = null;

    for (int x = 1; x <= 5; x++) {
        split = words.Split(delimiter, x);
            Console.WriteLine("\ncount = {0,2} ..............", x);
        foreach (string s in split) {
                Console.WriteLine("-{0}-", s);
              }
    }
    }
}
------------
Dernæst kan du bare løbe igennem arrayen og i en try ... catch prøve hhv en typekonvertering til integer og streng for hvert element.
Avatar billede m_skau Nybegynder
31. oktober 2003 - 16:08 #2
Nærmere eftertanke: Du skal først fjerne delimiters efter du har kørt split, ellers så kan du ikke have en streng der er et tal.
Avatar billede m_skau Nybegynder
31. oktober 2003 - 16:09 #3
Rettelse:
Nærmere eftertanke: Du skal først fjerne qualifiers efter du har kørt split, ellers så kan du ikke have en streng der er et tal.
Avatar billede arne_v Ekspert
31. oktober 2003 - 22:42 #4
Replace og Split kan ikke klare opgaven. Uanset rækkefølge.

Manuel parsning eller regular expressions !

Kode eksempel:

using System;
using System.Text;
using System.Text.RegularExpressions;

class MainClass
{
    public static void replaceandsplit(string s)
    {
        string[] s2 = s.Replace("\"","").Split(",".ToCharArray());
        for(int i = 0; i < s2.Length; i++)
        {
            Console.WriteLine("  " + s2[i]);
        }
    }
    public static void splitandreplace(string s)
    {
        string[] s2 = s.Split(",".ToCharArray()); 
        for(int i = 0; i < s2.Length; i++)
        {
            Console.WriteLine("  " + s2[i].Replace("\"",""));
        }
    }
    public static void manualparse(string s)
    {
        StringBuilder sb = new StringBuilder();
        int ix = 0;
        bool inq = false;
        while(ix < s.Length)
        {
            switch(s[ix])
            {
                case '"':
                    if(inq)
                    {
                        if(((ix + 1) < s.Length) && (s[ix + 1] == '"'))
                        {
                            sb.Append(s[ix]);
                            sb.Append(s[ix]);
                            ix++;
                        }
                        else
                        {
                            inq = false;
                        }
                    }
                    else
                    {
                        inq = true;
                    }
                    break;
                case ',':
                    if(inq)
                    {
                        sb.Append(s[ix]);
                    }
                    else
                    {
                        Console.WriteLine("  " + sb.ToString());
                        sb = new StringBuilder();
                    }
                    break;
                default:
                    sb.Append(s[ix]);
                    break;
            }
            ix++;
        }
        if(sb.Length > 0)
        {
            Console.WriteLine("  " + sb.ToString());
        }
    }
    public static void regexparse(string s)
    {
        MatchCollection res = Regex.Matches(s,"([0-9]+)|([\"]{1}(([^\"])|(\"\"))*[\"]{1})");
        for(int i = 0; i < res.Count; i++) {
            string s2 = res[i].Value;
            if(s2[0]=='"')
            {
                Console.WriteLine("  " + s2.Substring(1, s2.Length - 2));
            }
            else
            {
                Console.WriteLine("  " + s2);
            }
        }
    }
    private static void test(string s)
    {
        Console.WriteLine(s);
        Console.WriteLine("replace and split: ");
        replaceandsplit(s);
        Console.WriteLine("split and replace: ");
        splitandreplace(s);
        Console.WriteLine("manual parse: ");
        manualparse(s);
        Console.WriteLine("regex parse: ");
        regexparse(s);
    }
    public static void Main(string[] args)
    {
        test("123,\"abc\",\"\"\"quoted\"\"\",\"partly \"\"quoted\"\" !\",\"a,b,c\"");
    }
}
Avatar billede arne_v Ekspert
31. oktober 2003 - 22:43 #5
Output:

123,"abc","""quoted""","partly ""quoted"" !","a,b,c"
replace and split:
  123
  abc
  quoted
  partly quoted !
  a
  b
  c
split and replace:
  123
  abc
  quoted
  partly quoted !
  a
  b
  c
manual parse:
  123
  abc
  ""quoted""
  partly ""quoted"" !
  a,b,c
regex parse:
  123
  abc
  ""quoted""
  partly ""quoted"" !
  a,b,c
Avatar billede m_skau Nybegynder
31. oktober 2003 - 22:57 #6
:)
Det er selvfølgelig rigtigt, man kunne bare drømme om en verden uden kommaer og anførselstegn i teksten...
Avatar billede _just4fun_ Nybegynder
03. november 2003 - 09:31 #7
arne_v -> Yam, det er dejligt overskueligt stillet op!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester