Avatar billede KLS Novice
18. februar 2022 - 18:53 Der er 19 kommentarer og
2 løsninger

Regex spørsmål

Jeg har en fil med over 40000 linjer, som indeholder forskellige variabler, som jeg godt vil hente med regex udtryk for at rense og komme dem over i forskellige databaser.

Dette skal ikke gøres ofte, men i og med at filen er stor, så vil jeg godt automatisere processen en smule.

et lille udsnit af filen ser sådanne ud:

{
                "ClassName": "Desc_Water_C",
                "mDecalSize": "200.000000",
                "mPingColor": "(R=0.000000,G=0.000000,B=0.000000,A=0.000000)",
                "mCollectSpeedMultiplier": "1.000000",
                "mManualMiningAudioName": "Metal",
                "mDisplayName": "Water",
                "mDescription": "It's water.",
                "mAbbreviatedDisplayName": "H2O",
                "mStackSize": "SS_FLUID",
                "mCanBeDiscarded": "True",
                "mRememberPickUp": "False",
                "mEnergyValue": "0.000000",
                "mRadioactiveDecay": "0.000000",
                "mForm": "RF_LIQUID",
                "mSmallIcon": "Texture2D /Game/FactoryGame/Resource/RawResources/Water/UI/LiquidWater_Pipe_256.LiquidWater_Pipe_256",
                "mPersistentBigIcon": "Texture2D /Game/FactoryGame/Resource/RawResources/Water/UI/LiquidWater_Pipe_512.LiquidWater_Pipe_512",
                "mSubCategories": "",
                "mMenuPriority": "0.000000",
                "mFluidColor": "(B=212,G=176,R=122,A=255)",
                "mGasColor": "(B=0,G=0,R=0,A=0)",
                "mResourceSinkPoints": "5",
                "mBuildMenuPriority": "0.000000"
            },
            {
                "ClassName": "Desc_OreIron_C",
                "mDecalSize": "200.000000",
                "mPingColor": "(R=0.460000,G=0.291200,B=0.242434,A=1.000000)",
                "mCollectSpeedMultiplier": "1.000000",
                "mManualMiningAudioName": "Metal",
                "mDisplayName": "Iron Ore",
                "mDescription": "Used for crafting.\r\nThe most essential basic resource.",
                "mAbbreviatedDisplayName": "Iron",
                "mStackSize": "SS_MEDIUM",
                "mCanBeDiscarded": "True",
                "mRememberPickUp": "True",
                "mEnergyValue": "0.000000",
                "mRadioactiveDecay": "0.000000",
                "mForm": "RF_SOLID",
                "mSmallIcon": "Texture2D /Game/FactoryGame/Resource/RawResources/Nodes/UI/IconDesc_iron_new_64.IconDesc_iron_new_64",
                "mPersistentBigIcon": "Texture2D /Game/FactoryGame/Resource/RawResources/Nodes/UI/IconDesc_iron_new_256.IconDesc_iron_new_256",
                "mSubCategories": "",
                "mMenuPriority": "0.000000",
                "mFluidColor": "(B=0,G=0,R=0,A=0)",
                "mGasColor": "(B=0,G=0,R=0,A=0)",
                "mResourceSinkPoints": "1",
                "mBuildMenuPriority": "0.000000"
            },


Jeg vil godt hente alle de forskellige dele ud, men også den værdi der er tilknyttet til den enkelte variabel.

Det er ikke alle variabler der er vist her, men bare jeg får noget så jeg kan komme videre ville jeg være godt tilfreds.

Er der nogle der kan pege mig i den rigtige retning, jeg har både regexboddy og regexmagic til min rådighed, men syntes ikke jeg kan opnå det ønsket resultat.
Avatar billede arne_v Ekspert
18. februar 2022 - 19:05 #1
Det der ligner JSON.

Alt kan parses med regex men hvis det er valid JSON vil jeg tro at det var langt nemmere og sikrere at parse det som JSON.
Avatar billede claes57 Ekspert
18. februar 2022 - 19:17 #2
jeg ville nok (jeg gider ikke!) køre det via vba og excel.
indlæs filen, og skift linje for hver "ClassName" men dens navn i kolonne A
og test på de efterfølgende data, fx "mMenuPriority" - hvis den er oprettet tidligere som kolonne, så placer data i den kolonne, og hvis ikke, så opret en ny kolonne med det navn, og isæt data.
Så vil du til slut have et ark med en række for hver "ClassName" med alle dens data stående i samme række.
Du kan så lave en visning af en række ved kun at vise de udfyldte kolonner - og du kan se fx alle rækker hvor kolonne "mForm" har værdien "RF_LIQUID"
Avatar billede KLS Novice
18. februar 2022 - 21:30 #3
Arne_V det er JSON kan du pege mig i en retning vedr. den rigtige måde at gøre det på så ??
Avatar billede arne_v Ekspert
18. februar 2022 - 21:48 #4
Måske.

Hvilket programmerings sprog vil du bruge til at process data med? PHP? Python? Java? C#?
Avatar billede KLS Novice
18. februar 2022 - 22:11 #5
Tror det bliver noget C# eller VB

Det er en offline funktion så ikke noget PHP, men hvad du kan hjælpe med er godt, så skal jeg nok få det omsat til noget der kan bruges er jeg sikker på.
Avatar billede arne_v Ekspert
19. februar 2022 - 01:04 #6
40000 linier af 100 bytes er kun 4 MB og kan sagtens være i memory og så er det nemt at parse.

Min anbefaling til C# (eller VB.NET= er Newtonsoft.JSON (kan hentes med NuGet).

JSON inputÆ


[
          {
                "ClassName": "Desc_Water_C",
                "mDecalSize": "200.000000",
                "mPingColor": "(R=0.000000,G=0.000000,B=0.000000,A=0.000000)",
                "mCollectSpeedMultiplier": "1.000000",
                "mManualMiningAudioName": "Metal",
                "mDisplayName": "Water",
                "mDescription": "It's water.",
                "mAbbreviatedDisplayName": "H2O",
                "mStackSize": "SS_FLUID",
                "mCanBeDiscarded": "True",
                "mRememberPickUp": "False",
                "mEnergyValue": "0.000000",
                "mRadioactiveDecay": "0.000000",
                "mForm": "RF_LIQUID",
                "mSmallIcon": "Texture2D /Game/FactoryGame/Resource/RawResources/Water/UI/LiquidWater_Pipe_256.LiquidWater_Pipe_256",
                "mPersistentBigIcon": "Texture2D /Game/FactoryGame/Resource/RawResources/Water/UI/LiquidWater_Pipe_512.LiquidWater_Pipe_512",
                "mSubCategories": "",
                "mMenuPriority": "0.000000",
                "mFluidColor": "(B=212,G=176,R=122,A=255)",
                "mGasColor": "(B=0,G=0,R=0,A=0)",
                "mResourceSinkPoints": "5",
                "mBuildMenuPriority": "0.000000"
            },
            {
                "ClassName": "Desc_OreIron_C",
                "mDecalSize": "200.000000",
                "mPingColor": "(R=0.460000,G=0.291200,B=0.242434,A=1.000000)",
                "mCollectSpeedMultiplier": "1.000000",
                "mManualMiningAudioName": "Metal",
                "mDisplayName": "Iron Ore",
                "mDescription": "Used for crafting.\r\nThe most essential basic resource.",
                "mAbbreviatedDisplayName": "Iron",
                "mStackSize": "SS_MEDIUM",
                "mCanBeDiscarded": "True",
                "mRememberPickUp": "True",
                "mEnergyValue": "0.000000",
                "mRadioactiveDecay": "0.000000",
                "mForm": "RF_SOLID",
                "mSmallIcon": "Texture2D /Game/FactoryGame/Resource/RawResources/Nodes/UI/IconDesc_iron_new_64.IconDesc_iron_new_64",
                "mPersistentBigIcon": "Texture2D /Game/FactoryGame/Resource/RawResources/Nodes/UI/IconDesc_iron_new_256.IconDesc_iron_new_256",
                "mSubCategories": "",
                "mMenuPriority": "0.000000",
                "mFluidColor": "(B=0,G=0,R=0,A=0)",
                "mGasColor": "(B=0,G=0,R=0,A=0)",
                "mResourceSinkPoints": "1",
                "mBuildMenuPriority": "0.000000"
            }
]


Parse kendte felter:

using System;
using System.Collections.Generic;
using System.IO;

using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

namespace E
{
    public class Program
    {
        public static void Main(string[] args)
        {
            JArray all = (JArray)JsonConvert.DeserializeObject(File.ReadAllText(@"\work\e.json"));
            foreach(JObject one in all)
            {
                Console.WriteLine("**** start object ****");
                Console.WriteLine("ClassName = {0}", one.Value<string>("ClassName"));
                Console.WriteLine("mDecalSize = {0}", one.Value<string>("mDecalSize"));
                Console.WriteLine("mPingColor = {0}", one.Value<string>("mPingColor"));
            }
            Console.ReadKey();
        }
    }
}


output:

**** start object ****
ClassName = Desc_Water_C
mDecalSize = 200.000000
mPingColor = (R=0.000000,G=0.000000,B=0.000000,A=0.000000)
**** start object ****
ClassName = Desc_OreIron_C
mDecalSize = 200.000000
mPingColor = (R=0.460000,G=0.291200,B=0.242434,A=1.000000)

Parse alle felter:

using System;
using System.Collections.Generic;
using System.IO;

using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

namespace E
{
    public class Program
    {
        public static void Main(string[] args)
        {
            JArray all = (JArray)JsonConvert.DeserializeObject(File.ReadAllText(@"\work\e.json"));
            foreach(JObject one in all)
            {
                Console.WriteLine("**** start object ****");
                foreach(KeyValuePair<string,JToken> f in one)
                {
                    Console.WriteLine("field name = {0},  field value = {1}", f.Key, (string)f.Value);
                }
            }
            Console.ReadKey();
        }
    }
}


output:
**** start object ****
field name = ClassName,  field value = Desc_Water_C
field name = mDecalSize,  field value = 200.000000
field name = mPingColor,  field value = (R=0.000000,G=0.000000,B=0.000000,A=0.00
0000)
field name = mCollectSpeedMultiplier,  field value = 1.000000
field name = mManualMiningAudioName,  field value = Metal
field name = mDisplayName,  field value = Water
field name = mDescription,  field value = It's water.
field name = mAbbreviatedDisplayName,  field value = H2O
field name = mStackSize,  field value = SS_FLUID
field name = mCanBeDiscarded,  field value = True
field name = mRememberPickUp,  field value = False
field name = mEnergyValue,  field value = 0.000000
field name = mRadioactiveDecay,  field value = 0.000000
field name = mForm,  field value = RF_LIQUID
field name = mSmallIcon,  field value = Texture2D /Game/FactoryGame/Resource/Raw
Resources/Water/UI/LiquidWater_Pipe_256.LiquidWater_Pipe_256
field name = mPersistentBigIcon,  field value = Texture2D /Game/FactoryGame/Reso
urce/RawResources/Water/UI/LiquidWater_Pipe_512.LiquidWater_Pipe_512
field name = mSubCategories,  field value =
field name = mMenuPriority,  field value = 0.000000
field name = mFluidColor,  field value = (B=212,G=176,R=122,A=255)
field name = mGasColor,  field value = (B=0,G=0,R=0,A=0)
field name = mResourceSinkPoints,  field value = 5
field name = mBuildMenuPriority,  field value = 0.000000
**** start object ****
field name = ClassName,  field value = Desc_OreIron_C
field name = mDecalSize,  field value = 200.000000
field name = mPingColor,  field value = (R=0.460000,G=0.291200,B=0.242434,A=1.00
0000)
field name = mCollectSpeedMultiplier,  field value = 1.000000
field name = mManualMiningAudioName,  field value = Metal
field name = mDisplayName,  field value = Iron Ore
field name = mDescription,  field value = Used for crafting.
The most essential basic resource.
field name = mAbbreviatedDisplayName,  field value = Iron
field name = mStackSize,  field value = SS_MEDIUM
field name = mCanBeDiscarded,  field value = True
field name = mRememberPickUp,  field value = True
field name = mEnergyValue,  field value = 0.000000
field name = mRadioactiveDecay,  field value = 0.000000
field name = mForm,  field value = RF_SOLID
field name = mSmallIcon,  field value = Texture2D /Game/FactoryGame/Resource/Raw
Resources/Nodes/UI/IconDesc_iron_new_64.IconDesc_iron_new_64
field name = mPersistentBigIcon,  field value = Texture2D /Game/FactoryGame/Reso
urce/RawResources/Nodes/UI/IconDesc_iron_new_256.IconDesc_iron_new_256
field name = mSubCategories,  field value =
field name = mMenuPriority,  field value = 0.000000
field name = mFluidColor,  field value = (B=0,G=0,R=0,A=0)
field name = mGasColor,  field value = (B=0,G=0,R=0,A=0)
field name = mResourceSinkPoints,  field value = 1
field name = mBuildMenuPriority,  field value = 0.000000
Avatar billede arne_v Ekspert
19. februar 2022 - 01:06 #7
Hvis filen er for stor til at v;re i memory (40 GB i.s.f. 4 MB) så skal man bruge et andet API til at parse den (et streaming API).

Jeg kan godt konvertere C# koden til VB.NET hvis nødvendigt, men det er faktisk ret simpel kode.

Og jeg tror at du er langt bedre stillet end med regex.
Avatar billede arne_v Ekspert
19. februar 2022 - 01:36 #8
For en oversigt over muligheder i forskellige sprog se:

https://www.vajhoej.dk/arne/articles/jsonproc.html
Avatar billede KLS Novice
19. februar 2022 - 15:28 #9
Jeg får kigget på koden i aften arne_v men det lyder meget som om du har ret med at det er lettere med json.

Du må gerne komme med eksempler med vb.net kode hvis du har tiden til det.
Jeg har måske nogle flere spørgsmål i forhold til det aktuelle projekt men der vil jeg flytte spørgsmålet over i den rigtige kategori.

Pft arne_v
Avatar billede arne_v Ekspert
19. februar 2022 - 16:26 #10
Man kan oversætte fra C# til VB.NET maskinelt.

Imports System
Imports System.Collections.Generic
Imports System.IO

Imports Newtonsoft.Json
Imports Newtonsoft.Json.Linq

Namespace E
    Public Class Program
        Public Shared Sub Main(args As String())
            Dim all As JArray = DirectCast(JsonConvert.DeserializeObject(File.ReadAllText("\work\e.json")), JArray)
            For Each one As JObject In all
                Console.WriteLine("**** start object ****")
                Console.WriteLine("ClassName = {0}", one.Value(Of String)("ClassName"))
                Console.WriteLine("mDecalSize = {0}", one.Value(Of String)("mDecalSize"))
                Console.WriteLine("mPingColor = {0}", one.Value(Of String)("mPingColor"))
            Next
            Console.ReadKey()
        End Sub
    End Class
End Namespace


Imports System
Imports System.Collections.Generic
Imports System.IO

Imports Newtonsoft.Json
Imports Newtonsoft.Json.Linq

Namespace E
    Public Class Program
        Public Shared Sub Main(args As String())
            Dim all As JArray = DirectCast(JsonConvert.DeserializeObject(File.ReadAllText("\work\e.json")), JArray)
            For Each one As JObject In all
                Console.WriteLine("**** start object ****")
                For Each f As KeyValuePair(Of String, JToken) In one
                    Console.WriteLine("field name = {0},  field value = {1}", f.Key, f.Value.ToString())
                Next
            Next
            Console.ReadKey()
        End Sub
    End Class
End Namespace
Avatar billede KLS Novice
21. februar 2022 - 20:54 #11
Jeg har stadig lidt udfordringer arne_v

Jeg har mere end et array

Fil strukturen ser sådanne ud :


{
        "NativeClass": "xxxxxx'",
        "Classes": [
            {
            "xxxxxx": "yyyyy"
            "xxxxxx": "yyyyy"
            "xxxxxx": "yyyyy"
            }
            ]
},
{
        "NativeClass": "aaaaaaa'",
        "Classes": [
            {
            "bbbbbb": "ccccc"
            "bbbbbb": "ccccc"
            "bbbbbb": "ccccc"
            }
            ]
},


Den henter kun værdierne i NativeCalss og Classes som selvstændige værdier.

Jeg har nu prøvet lidt af hvert for at få det til at virke, med det ekstra Array.
Men jeg syntes ikke jeg kan få det til at fungere.
Avatar billede arne_v Ekspert
21. februar 2022 - 22:31 #12
[
{
        "NativeClass": "xxxxxx'",
        "Classes": [
            {
            "xxxxxx1": "yyyyy1",
            "xxxxxx2": "yyyyy2",
            "xxxxxx3": "yyyyy3"
            }
            ]
},
{
        "NativeClass": "aaaaaaa'",
        "Classes": [
            {
            "bbbbbb1": "ccccc1",
            "bbbbbb2": "ccccc2",
            "bbbbbb3": "ccccc3"
            }
            ]
}
]


using System;
using System.Collections.Generic;
using System.IO;

using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

namespace E
{
    public class Program
    {
        public static void Main(string[] args)
        {
            JArray all = (JArray)JsonConvert.DeserializeObject(File.ReadAllText(@"\work\e2.json"));
            foreach(JObject one in all)
            {
                Console.WriteLine("**** start big object ****");
                Console.WriteLine("NativeClass = {0}", one.Value<string>("NativeClass"));
                foreach(JObject o in one.Value<JArray>("Classes"))
                {
                    foreach(KeyValuePair<string,JToken> f in o)
                    {
                      Console.WriteLine("field name = {0},  field value = {1}", f.Key, (string)f.Value);
                    }
                }
            }
            Console.ReadKey();
        }
    }
}


**** start big object ****
NativeClass = xxxxxx'
field name = xxxxxx1,  field value = yyyyy1
field name = xxxxxx2,  field value = yyyyy2
field name = xxxxxx3,  field value = yyyyy3
**** start big object ****
NativeClass = aaaaaaa'
field name = bbbbbb1,  field value = ccccc1
field name = bbbbbb2,  field value = ccccc2
field name = bbbbbb3,  field value = ccccc3
Avatar billede KLS Novice
22. februar 2022 - 07:53 #13
Der er åbenbart noget som jeg ikke fatter, for har opdaget endnu et array i filen, men har prøvet at lave noget af det samme som du har skrevet her eller bare se om der er en værdi, som jeg så kan sortere udenom, men jeg får bare denne fejl hver gang

field name = mRelevantShopSchematics, field Value =
Unhandled exception. System.ArgumentException: Can not convert Array to String.
  at Newtonsoft.Json.Linq.JToken.op_Explicit(JToken value)
Avatar billede arne_v Ekspert
22. februar 2022 - 14:55 #14
Så (string)f.Value fejler fordi f.Value er et nyt array og ikke en string.

Enten skal vi kende strukturen eller så skal der kodes helt anderledes så koden kan håndtere vilkårligt dybe strukturer.
Avatar billede KLS Novice
22. februar 2022 - 19:34 #15
Jeg har lidt svært ved at gennemskue strukturen, men her kommer mit absolut bedste bud


[
    {
        "NativeClass": "Class'aaaaaaaa'",
        "Classes": [
            {
                "aaaaaa": "bbbbbbb",
                "cccccc": "ddddddd",
                "eeeeee": [
                    {
                        "xxxxxx": "yyyyyy",
                        "wwwwww": "zzzzzz"
                    },
                    {
                        "xxxxxx": "yyyyyy",
                        "wwwwww": "zzzzzz"
                    }
                ],
                "ffffff": "gggggg",
                "hhhhhh": "iiiii"
            },
            {
                "aaaaaa": "bbbbbb",
                "cccccc": "dddddd",
                "eeeeee": "ffffff",
                "ffffff": "gggggg",
                "hhhhhh": "iiiii"
            },
            {
                "aaaaaa": "bbbbbbb",
                "cccccc": "ddddddd",
                "eeeeee": [
                    {
                        "xxxxxx": "yyyyyy",
                        "wwwwww": "zzzzzz"
                    },
                    {
                        "xxxxxx": "yyyyyy",
                        "wwwwww": "zzzzzz"
                    }
                ],
                "ffffff": "gggggg",
                "hhhhhh": "iiiii"
            }
        ]
    },
    {
        "NativeClass": "Class'bbbbbb'",
        "Classes": [
            {
            "aaaaaa": "bbbbbbb",
            "cccccc": "ddddddd",
            "eeeeee": [
                {
                "xxxxxx": "yyyyyy",
                "wwwwww": "zzzzzz",
                },
                {
                "xxxxxx": "yyyyyy",
                "wwwwww": "zzzzzz"
                }
                ]
            "ffffff": "gggggg",
            "hhhhhh": "iiiii",
            },
            {
            "aaaaaa": "bbbbbb",
            "cccccc": "dddddd",
            "eeeeee": "ffffff"
            "ffffff": "gggggg",
            "hhhhhh": "iiiii",
            },
            {
            "aaaaaa": "bbbbbbb",
            "cccccc": "ddddddd",
            "eeeeee": [
                {
                "xxxxxx": "yyyyyy",
                "wwwwww": "zzzzzz",
                },
                {
                "xxxxxx": "yyyyyy",
                "wwwwww": "zzzzzz"
                }
                ]
            "ffffff": "gggggg",
            "hhhhhh": "iiiii"
            }
        ]
    }
]


Det er mit bud efter at have kigget filens 40K+ linjer igennem.

Filen findes her [ https://1drv.ms/u/s!AgwJt08_uIRyh4sglZ3EuSv4N-F6Mw?e=BwTRwY ]
Avatar billede KLS Novice
22. februar 2022 - 19:35 #16
Avatar billede arne_v Ekspert
22. februar 2022 - 20:52 #17
Jeg prøver at kigge på det i aften.
Avatar billede arne_v Ekspert
23. februar 2022 - 02:10 #18
Jeg tror at vi er nødt til at skifte til en mere generel JSON cruncher.

Her er noget kode, men det er altså noget ,mere avanceret end de foregående eksempler.

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;

using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

namespace E
{
    public enum PathType { OBJECT_FIELD_NAME, ARRAY_INDEX }
    public class PathElement
    {
        public PathType Type { get; set; }
        public string Value { get; set; }
        public PathElement(int val)
        {
            this.Type = PathType.ARRAY_INDEX;
            this.Value = val.ToString();
        }
        public PathElement(string val)
        {
            this.Type = PathType.OBJECT_FIELD_NAME;
            this.Value = val;
        }
        public override string ToString()
        {
            switch(Type)
            {
                case PathType.OBJECT_FIELD_NAME:
                    return"object field name " + Value;
                case PathType.ARRAY_INDEX:
                    return "array index " + Value;
                default:
                    throw new Exception("Houston we have a problem");
            }
        }
    }
    public class Path
    {
        private List<PathElement> elms;
        public Path()
        {
            this.elms = new List<PathElement>();
        }
        public Path(List<PathElement> elms)
        {
            this.elms = elms;
        }
        public Path Append(PathElement elm)
        {
            List<PathElement> temp = this.elms.Select(p => p).ToList();
            temp.Add(elm);
            return new Path(temp);
        }
        public override string ToString()
        {
            return string.Join(" ", this.elms);
        }
    }
    public class JsonParser
    {
        public delegate void Handle(Path path, string val);
        private void Process(JToken tok, Path path, Handle h)
        {
            if(tok is JArray)
            {
                int ix = 0;
                foreach(JToken tok2 in tok as JArray)
                {
                    Process(tok2, path.Append(new PathElement(ix)), h);
                    ix++;
                }
            }
            else if(tok is JObject)
            {
                foreach(KeyValuePair<string,JToken> f in tok as JObject)
                {
                    Process(f.Value, path.Append(new PathElement(f.Key)), h);
                }   
            }
            else if(tok is JValue)
            {
                h(path, (tok as JValue).Value.ToString());
            }
            else
            {
                throw new Exception("Houston we have a problem");
            }
        }
        public void Process(string fnm, Handle h)
        {
            Process((JToken)JsonConvert.DeserializeObject(File.ReadAllText(fnm)), new Path(), h);
        }
    }
    public class Program
    {
        private static void Print(Path path, string val)
        {
            Console.WriteLine("{0} = {1}", path, val);
        }
        public static void Main(string[] args)
        {
            JsonParser parser = new JsonParser();
            parser.Process(@"\work\e4.json", Print);
            Console.ReadKey();
        }
    }
}
Avatar billede arne_v Ekspert
23. februar 2022 - 02:11 #19
Ideen er at du definerer din egen funktion i.s.f. min Print og så bliver den kaldt med fuld path og en værdi og du kan gøre hvad du vil med data.

Jg ved ikke om det passer med den måde du skal processe data på.
Avatar billede KLS Novice
23. februar 2022 - 12:06 #20
Det er så perfekt, du har givet mig så meget hjælp, så nu kan jeg komme videre med mit hygge projekt.

Det er heldigvis kun noget der skal konvertere filen en gang i mellem, når der er lavet opdateringer.
Avatar billede arne_v Ekspert
23. februar 2022 - 15:06 #21
Kom lige til at tænke på at Path skal nok have en:

        public List<PathElement> GetElements()
        {
            return elms;
        }
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
Kurser inden for grundlæggende programmering

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