Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[C#] CSV parsen met library oneindige loop

Pagina: 1
Acties:

  • afraca
  • Registratie: April 2009
  • Laatst online: 13-08 16:46

afraca

Open Source!

Topicstarter
Ik wil data van de Ohloh / OpenHub API naar een CSV schrijven, en dat later weer parsen voor verdere bewerking. Ik doe deze Organization Collection call: https://github.com/blackd...rganization-collection.md , voor 2 pagina's, en stop dat na XML parsen in een struct:

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
namespace DataGatheringApplication.Structs.Api
{
    public struct OrganizationCollectionItem
    {
        public int AffiliatedCommitters;
        public DateTime CreatedAt;
        public string Homepage;
        public string Name;
        public int ProjectsCount;
        public string Type;
        public DateTime UpdatedAt;
        public string UrlName;
        public string XmlUrl;

        public OrganizationCollectionItem(string name, string xmlUrl, DateTime createdAt, DateTime updatedAt,
            string homepage, string urlName, string type, int projectsCount, int affiliatedCommitters)
        {
            Name = name;
            XmlUrl = xmlUrl;
            CreatedAt = createdAt;
            UpdatedAt = updatedAt;
            Homepage = homepage;
            UrlName = urlName;
            Type = type;
            ProjectsCount = projectsCount;
            AffiliatedCommitters = affiliatedCommitters;
        }
    }
}


Van eerder kende ik nog een prima CSV schrijver/lezer die makkelijk met objecten kan omgaan:
http://www.codeproject.co...ast-CSV-library-in-Csharp

Voor jullie gemak even de sourcecode: https://gist.github.com/anonymous/44366f1c7cd4abf405dd

En het wegschrijven van die 2 pagina's aan project structs naar CSV ging helemaal prima 8) Maar vervolgens:

C#:
1
2
3
4
5
var test = CsvFile.Read<OrganizationCollectionItem>(DataLocation + filename + ".csv");
            foreach (var item in test)
            {
                Console.WriteLine(item.UrlName);
            }


Dit komt in een oneindige loop terecht. Er komen geen exceptions en er wordt niks naar de console geschreven. Bij een breakpoint zetten op de 'var test' regel, en ik klik op "expand results" ding in debug tooltip van Visual Studio, dan zegt hij iets van "timed out".

Wat heb ik zelf al geprobeerd?

Intern roept die foreach MoveNext() aan. Voor jullie gemak, nogmaals de sourcecode. In die methode lijkt
fieldValues
goed gevuld te worden. Netjes een array van 9, met strings, die lijken te kloppen.

Ik vermoed dat die setters niet helemaal lekker lopen. Die zouden
Current
moeten vullen in regel 425 van de gist, maar dat is wat lastig debuggen omdat ze on-the-fly aangemaakt worden. Hoe debug ik dit handig?

edit: nog een extra vraagje: waarom resulteert dit in die oneindige loop, en niet gewoon null values?

IMDB vote history | Next-gen OS, audio en video player, search engine en Movie DB


  • sig69
  • Registratie: Mei 2002
  • Laatst online: 22:42
Maak van OrganizationCollectionItem een class ipv een struct en dan ben je er wel denk ik.

Roomba E5 te koop


  • InZane
  • Registratie: Oktober 2000
  • Laatst online: 18:33
sig69 schreef op woensdag 17 december 2014 @ 08:27:
Maak van OrganizationCollectionItem een class ipv een struct en dan ben je er wel denk ik.
Dat denk ik ook. Waarom een struct eigenlijk?

  • Snake
  • Registratie: Juli 2005
  • Laatst online: 07-03-2024

Snake

Los Angeles, CA, USA

InZane schreef op woensdag 17 december 2014 @ 09:11:
[...]


Dat denk ik ook. Waarom een struct eigenlijk?
Omdat dit een domme data container is zonder behavior.

Going for adventure, lots of sun and a convertible! | GMT-8


  • sig69
  • Registratie: Mei 2002
  • Laatst online: 22:42
Dan voldoet een class ook. In dit geval zelfs beter, want een struct is bedoeld voor "lightweight objects", wat OrganizationCollectionItem duidelijk niet is.

Roomba E5 te koop


  • Sebazzz
  • Registratie: September 2006
  • Laatst online: 19-11 18:15

Sebazzz

3dp

Snake schreef op woensdag 17 december 2014 @ 09:14:
[...]

Omdat dit een domme data container is zonder behavior.
Dat maakt niet uit. Een struct kan je ook intelligent maken en een class dom. Ik zou de Microsoft richtlijnen aanhouden, waarbij ik primair denk aan:
[q=http://msdn.microsoft.com/en-us/library/ms229017%28v=vs.110%29.aspx]X AVOID defining a struct unless the type has all of the following characteristics:
[...]
• It has an instance size under 16 bytes
[...]

[Te koop: 3D printers] [Website] Agile tools: [Return: retrospectives] [Pokertime: planning poker]


  • scarhand
  • Registratie: December 2001
  • Laatst online: 24-06-2021
In de iterator van CsvFileReader<T> wordt MoveNext aangeroepen om te kijken of er nog een item uit de collectie gehaald kan worden. MoveNext returned een bool die aangeeft of het ingelezen item niet null is.
Als de line die ingelezen is leeg is wordt het item geinitialiseerd op default(T). Voor een struct is dit nooit null.
Dus krijg je een infinite loop.

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
scarhand schreef op woensdag 17 december 2014 @ 09:39:
In de iterator van CsvFileReader<T> wordt MoveNext aangeroepen om te kijken of er nog een item uit de collectie gehaald kan worden. MoveNext returned een bool die aangeeft of het ingelezen item niet null is.
Als de line die ingelezen is leeg is wordt het item geinitialiseerd op default(T). Voor een struct is dit nooit null.
Dus krijg je een infinite loop.
Dat is dan wel een redelijke bug IMHO. Daar hadden ze dan of een andere check moeten doen, of een "class" constraint op de T moeten leggen.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • afraca
  • Registratie: April 2009
  • Laatst online: 13-08 16:46

afraca

Open Source!

Topicstarter
Kijk eens aan wat een activiteiten hier :+ Inderdaad had ik ergens in m'n hoofd wel een keer het idee gehad dat ik van die struct een class kon maken, maar omdat ikzelf niet het
C#:
1
default(T)
gedrag kende, kon ik niet beargumenteren waarom dat fout was. Klinkt niet dramatisch moeilijk, niet zo heel goed gedebugged van mij. Thanks :)

En inderdaad Woy, een constraint daar zou dat hebben bespaard. Zal het even naar de originele auteur vermelden.

edit: Interessant die richtlijnen omtrent wanneer structs trouwens. Zelf was ik inderdaad voor wanneer het een soort set-only verzameling data is, zonder gedrag. Als ik zie dat iets een Struct is, is dat een reminder voor mezelf om mogelijk gedrag elders onder te brengen. Maar misschien is het handig om die strategie toch te herzien.

[ Voor 26% gewijzigd door afraca op 17-12-2014 11:08 ]

IMDB vote history | Next-gen OS, audio en video player, search engine en Movie DB

Pagina: 1