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!
Annonceindlæg tema
Offentlig digitalisering
Fra effektivisering til digital suverænitet. Hvordan skaber det offentlige en digital fremtid med AI, sikkerhed og kontrol i centrum?
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.
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.
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.
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\""); } }
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
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...
03. november 2003 - 09:31
#7
arne_v -> Yam, det er dejligt overskueligt stillet op!
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.