Avatar billede kattendk Nybegynder
12. januar 2009 - 21:55 Der er 18 kommentarer og
2 løsninger

ReadSections fungere ikke helt efter hensigten?

public string[] ReadSections()
        {

            return getString(null, null, null).Replace("¤%&&", "[").Replace("¤%&%", "]").Replace("¤%%%", "|").Split((char)0);

        }


        public int BufferLen
        {
            get { return this._bufferLen; }
            set
            {
                if (value > 163835) { this._bufferLen = 163835; }
                else if (value < 1) { this._bufferLen = 1; }
                else { this._bufferLen = value; }
            }
        }

Problemet er, at der er 286 sektioner i min ini fil. Men den kan kun finde de 66 eller hvad der går galt.

string[] array = sIni.ReadSections();

I array.Length skriver den nemlig kun 66. Hvordan kan jeg få denne bug væk?
Avatar billede websmith Nybegynder
12. januar 2009 - 22:09 #1
kan du beskrive formatet af din ini fil som du prøver at læse, og hvordan du forventer den bliver læst ind?

jeg kan se du laver nogle string replacements, fx ¤%&& til [ osv, og så splitter du på char 0, hvilket plejer at være string terminator.
Avatar billede kattendk Nybegynder
12. januar 2009 - 22:29 #2
Altså der står navne i sektioner

[blabla]
kills=13
deaths=24
[ost]
kills=42
deaths=41

osv. dem er der 286 af.

double kills;
                            double.TryParse(sIni.Readini(gauth, "kills"), out kills);
                            double deaths;
                            double.TryParse(sIni.Readini(gauth, "deaths"), out deaths);
                            int clear = 0;
                            if (deaths == 0) { deaths = 1; clear++; }
                            double kd = kills / deaths;
                            if (clear > 0) { deaths = 0; }
                            int rank = 1;
                            string[] array = sIni.ReadSections();
Avatar billede websmith Nybegynder
12. januar 2009 - 23:07 #3
hmm, jeg ville nok lave min egen parser :)

Dvs. indlæse filen i en streamreader.
Avatar billede websmith Nybegynder
12. januar 2009 - 23:07 #4
Jeg har lige lavet følgende meget simple parser:

public class IniReader
    {
        private string fileName;

        public IniReader(string fileName)
        {
            this.fileName = fileName;
        }

        private bool parsed;

        private List<IniSection> iniSections = new List<IniSection>();

        private void Parse()
        {
            string contents;

            using (StreamReader sr = new StreamReader(fileName))
            {
                contents = sr.ReadToEnd();
            }


            string[] sections = contents.Split(new char[] { '[' }, StringSplitOptions.RemoveEmptyEntries);

            foreach (string section in sections)
            {
                IniSection iniSection = new IniSection();
                iniSection.Values = new Dictionary<string, string>();
                string[] elements = section.Split(new char[] { '\n' }, StringSplitOptions.RemoveEmptyEntries);
                for (int x = 0; x < elements.Length; x++)
                {
                    if (x == 0)
                    {
                        //Første element er section name
                        iniSection.SectionName = elements[x].Replace("]", "").Trim();
                        continue;
                    }
                    string[] parts = elements[x].Split(new char[] { '=' }, StringSplitOptions.RemoveEmptyEntries);
                    if (parts.Length == 2)
                    {
                        iniSection.Values.Add(parts[0].Trim(), parts[1].Trim());
                    }

                }
                iniSections.Add(iniSection);
            }

        }

        /// <summary>
        /// Gets the section contents.
        /// </summary>
        /// <param name="sectionName">Name of the section.</param>
        /// <param name="variableName">Name of the variable.</param>
        /// <returns></returns>
        public string GetSectionContents(string sectionName, string variableName)
        {
            if (!parsed)
            {
                Parse();
            }
            IniSection iniSection =
                iniSections.Find(delegate(IniSection section) { return section.SectionName == sectionName; });
            //Eller hvis .net 3.5 lambda section=>section.SectionName==sectionName
            if (iniSection == null)
            {
                return null;
            }

            //sektion ikke fundet
            if (!iniSection.Values.ContainsKey(variableName))
            {
                //variable ikke fundet
                return null;
            }

            return iniSection.Values[variableName];
        }
    }

    public class IniSection
    {
        public string SectionName { get; set; }

        public Dictionary<string, string> Values { get; set; }
    }
Avatar billede websmith Nybegynder
12. januar 2009 - 23:08 #5
Og den bruges således:

IniReader ir = new IniReader("C:\\omg.ini");

            string ostKills = ir.GetSectionContents("ost", "kills");
            Console.WriteLine(ostKills);
Avatar billede websmith Nybegynder
12. januar 2009 - 23:08 #6
Jeg har testet den med en ini fil som den du har foroven, og den fungerer fint.

Hvis du skal bruge den til noget seriøst, vil jeg nok putte lidt try catch ind hist og pist :)

Mvh
Avatar billede websmith Nybegynder
12. januar 2009 - 23:10 #7
ups, det gik stærkt :)

Der skal lige en linie ind i Parse metode:

Før den returnerer skal der en :

parsed=true;

ind ellers vil den indlæse hele file hver gang du henter en sektion :)

Og selvfølgelig kan den også udvides med en collection af sektions navne, det er bare at læse ud fra iniSections collection, og returnere alle SecionName variabler :)
Avatar billede kattendk Nybegynder
12. januar 2009 - 23:22 #8
Da jeg er ret ny, kunne jeg få dig til at smide try og catch ind som du mener skal være?

Og det skal bruges seriøst :)
Avatar billede websmith Nybegynder
13. januar 2009 - 17:08 #9
Jeg har lige lavet en ny version:

public class IniReader
    {
        private string fileName;

        public IniReader(string fileName)
        {
            this.fileName = fileName;
        }

        private bool parsed;

        private readonly List<IniSection> iniSections = new List<IniSection>();

        /// <summary>
        /// Gets all sections.
        /// </summary>
        /// <value>All sections.</value>
        public List<IniSection> AllSections
        {
            get
            {
                if(!parsed)
                {
                    Parse();
                }
                return iniSections;
            }
        }

        /// <summary>
        /// Gets all section names.
        /// </summary>
        /// <value>All section names.</value>
        public List<string> AllSectionNames
        {
            get
            {
                //.NET 3.5 return AllSections.ConvertAll<string>(sec => sec.SectionName);
                return AllSections.ConvertAll<string>(delegate(IniSection sec)
                                                          {
                                                              return sec.SectionName;
                                                          });
            }
        }

        /// <summary>
        /// Parses the ini file into IniSection objects
        /// </summary>
        private void Parse()
        {
            string contents;

            using (StreamReader sr = new StreamReader(fileName))
            {
                contents = sr.ReadToEnd();
            }


            string[] sections = contents.Split(new char[] {'['}, StringSplitOptions.RemoveEmptyEntries);

            foreach (string section in sections)
            {
                IniSection iniSection = new IniSection();
                iniSection.Values = new Dictionary<string, string>();
                string[] elements = section.Split(new char[] {'\n'}, StringSplitOptions.RemoveEmptyEntries);
                for (int x = 0; x < elements.Length; x++)
                {
                    if (x == 0)
                    {
                        //Første element er section name
                        iniSection.SectionName = elements[x].Replace("]", "").Trim();
                        continue;
                    }
                    string[] parts = elements[x].Split(new char[] {'='}, StringSplitOptions.RemoveEmptyEntries);
                    if (parts.Length == 2)
                    {
                        iniSection.Values.Add(parts[0].Trim(), parts[1].Trim());
                    }

                }
                iniSections.Add(iniSection);
            }

            parsed = true;

        }

        /// <summary>
        /// Gets the section contents.
        /// </summary>
        /// <param name="sectionName">Name of the section.</param>
        /// <param name="variableName">Name of the variable.</param>
        /// <returns></returns>
        public string GetSectionContents(string sectionName, string variableName)
        {
            if (!parsed)
            {
                Parse();
            }
            IniSection iniSection =
                iniSections.Find(delegate(IniSection section) { return section.SectionName == sectionName; });
            //Eller hvis .net 3.5 lambda section=>section.SectionName==sectionName
            if (iniSection == null)
            {
                return null;
            }

            //sektion ikke fundet
            if (!iniSection.Values.ContainsKey(variableName))
            {
                //variable ikke fundet
                return null;
            }

            return iniSection.Values[variableName];
        }
    }

    public class IniSection
    {
        public string SectionName { get; set; }

        public Dictionary<string, string> Values { get; set; }
    }
Avatar billede websmith Nybegynder
13. januar 2009 - 17:15 #10
Og bruges:

IniReader ir = new IniReader("C:\\omg.ini");
            int totalDeaths = 0;
            int totalKills = 0;
            foreach(string sectionName in ir.AllSectionNames)
            {
                string kills = ir.GetSectionContents(sectionName, "kills");
                string deaths = ir.GetSectionContents(sectionName, "deaths");
                int d;
                int k;
                if(Int32.TryParse(deaths,out d))
                {
                    totalDeaths += d;
                }
                if (Int32.TryParse(kills, out k))
                {
                    totalKills += k;
                }
            }
            Console.WriteLine("Total Kills:{0}", totalKills);
            Console.WriteLine("Total Deaths:{0}", totalDeaths);
foreach(IniSection section in ir.AllSections)
            {
                Console.WriteLine("Section {0} contains the following keys and values", section.SectionName);
                foreach(string name in section.Values.Keys)
                {
                    Console.WriteLine("{0} = {1}", name, section.Values[name]);
                }
            }

            string ostKills = ir.GetSectionContents("ost", "kills");
            Console.WriteLine(ostKills);

Som giver det følgende output:
Total Kills:55
Total Deaths:65
Section blabla contains the following keys and values
kills = 13
deaths = 24
Section ost contains the following keys and values
kills = 42
deaths = 41
42

Jeg håber det hjælper dig på vej :)
Avatar billede kattendk Nybegynder
14. januar 2009 - 09:08 #11
Hej igen.

Jeg får følgende fejl:

Error    1    The type or namespace name 'List' could not be found (are you missing a using directive or an assembly reference?)    C:\Documents and Settings\User\Desktop\Program.cs    180    30   
Error    2    The type or namespace name 'List' could not be found (are you missing a using directive or an assembly reference?)    C:\Documents and Settings\User\Desktop\Program.cs    186    20   
Error    3    The type or namespace name 'List' could not be found (are you missing a using directive or an assembly reference?)    C:\Documents and Settings\User\Desktop\Program.cs    202    20   
Error    4    The type or namespace name 'Dictionary' could not be found (are you missing a using directive or an assembly reference?)    C:\Documents and Settings\User\Desktop\Program.cs    291    20   

-> private readonly List<IniSection> iniSections = new List<IniSection>()
-> public List<IniSection> AllSections
-> public List<string> AllSectionNames
-> public Dictionary<string, string> Values { get; set; }

Håber du kan hjælpe :o)
Avatar billede websmith Nybegynder
14. januar 2009 - 16:26 #12
du skal tilrette din using statements i toppen af klasse filen.

Dvs. du skal tilføje

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
Avatar billede kattendk Nybegynder
14. januar 2009 - 16:33 #13
Okey, hvis den bare skal skrive hvor mange sektioner der er, hvordan skal den så bruges?

Skal nemlig bruge den i denne:
string[] array = hvor mange sektioner der er i min sIni?
Avatar billede websmith Nybegynder
14. januar 2009 - 17:04 #14
hvor mange sektioner kan du bruge følgende:

IniReader ir = new IniReader("C:\\omg.ini");
int antalSektioner = ir.AllSections.Count;
Avatar billede kattendk Nybegynder
14. januar 2009 - 17:16 #15
jaa men skal nu bruge det i min array, så den går alle igennem i mit eget script :)

Så ville helst gerne have haft string[] array = blabla
Avatar billede websmith Nybegynder
14. januar 2009 - 17:21 #16
Så kan du bruge

string[] names = ir.AllSectionNames.ToArray();
Avatar billede kattendk Nybegynder
14. januar 2009 - 17:42 #17
Får fejl i denne: iniSection.Values.Add(parts[0].Trim(), parts[1].Trim());

Noget jeg gør forkert?
Avatar billede kattendk Nybegynder
14. januar 2009 - 17:44 #18
Error: System.ArgumentException: An item with the same key has already been added.
Avatar billede websmith Nybegynder
14. januar 2009 - 17:47 #19
hvorfor vil du tilføje noget til values?

Når du tilgår IniReader, så har den allerede parset filen - det er jo hele humlen ved filen.

Har du ikke prøvet køre eksemplet jeg sendte?

Under alle omstændigheder, Klasserne var bare en lille hjælp, og jeg har ikke lyst til at blive ved med at gennemgå den samme kode hele tiden.

Hvis du skal have mere hjælp så kunne det være du skulle forklare hvad det er du prøver at bruge dine ini filer til.
Avatar billede kattendk Nybegynder
17. januar 2009 - 15:09 #20
Jeg tror jeg må finde en anden løsning, for jeg kan slet ikke få det til at virke.
Ellers tak for hjælpen.
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