Black Friday = Pricewatch Bekijk onze selectie van de beste Black Friday-deals en voorkom een miskoop.

C# .Split 'Probleem'

Pagina: 1
Acties:

  • WasBak
  • Registratie: September 2000
  • Niet online
Ik zit met een vervelend probleem.. goh ;)

Ik heb een CSV bestand met data, en bevat dus verschillende "kolommen" aan data gesplitst door een komma. We zijn helaas gebonden aan een komma aangezien de klant dit wil.

Nu alles aardig en wel, maar in een 'datakolom' kan volgens de klant ook een komma zitten. Waardoor ik met .NET's Split() functie dus in de problemen kom. Aangezien er dan ook data kolommen gesplitst worden. Enige voordeel wat ik wel heb, is dat deze kolom tussen quotes staan, misschien dat ik daar iets mee kan?

Ik heb uiteraard google bezocht maar nog niets concreets kunnen vinden. Zijn er mensen met een idee hoe ik dat zou kunnen verhelpen?

Hoop dat het duidelijk is.

  • kenneth
  • Registratie: September 2001
  • Niet online

kenneth

achter de duinen

Het internet staat vol met csv-parsers in C# ... dus even een stapje terug (je begint al gelijk met .Split()) en verder googlen zou ik zeggen :)

Look, runners deal in discomfort. After you get past a certain point, that’s all there really is. There is no finesse here.


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Zolang het maar één kolom is, is het geen probleem. Stel, het betreft kolom 3 en er zijn 5 kolommen. Met een split-oplossing kijk je dan eerst naar de eerste twee elementen in de array; die komen immers altijd overeen met de eerste twee kolommen. Daarna kijk je naar de laatste twee; die komen immers altijd overeen met de laatste twee kolommen. Alles wat nog overblijft is dan dat ene dataveld waarin een komma voor mag komen.

Wanneer je meer velden hebt waar een komma in moet kunnen staan heb je een probleem. ;)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • roy-t
  • Registratie: Oktober 2004
  • Laatst online: 17-10 16:43
Je zou je eigen split functie kunnen maken. Maar alleen als er geen quotes in de kolomwaarden staan want dan kun je gewoon telkens de data tussen paren quotes zoeken, maar als er in de gewone kolomwaarden ook quotes zitten dan heb je echt een probleem, tenzij deze altijd afgesloten zijn dan kun je de komma vinden die niet tussen quotes zit maar dit is natuurlijk geen ideale situatie.

Iets als een chararray maken van 1 rij en dan telkens zoeken naar het eerste quote, dan alle chars daartussen verpakken in een string totdat je weer een quote tegenkomt. Dan de string in een nieuwe string array zetten en zoeken naar het volgende quote en weer opnieuw beginnen. Dit zou uiteindelijk een string[] moeten opleveren met alle waarden van 1 rij.

Edit: damn te traag!

~ Mijn prog blog!


  • WasBak
  • Registratie: September 2000
  • Niet online
-NMe- schreef op maandag 25 augustus 2008 @ 15:20:
Wanneer je meer velden hebt waar een komma in moet kunnen staan heb je een probleem. ;)
De kans is heel erg klein, maar wel mogelijk.
roy-t schreef op maandag 25 augustus 2008 @ 15:22:
Iets als een chararray maken van 1 rij en dan telkens zoeken naar het eerste quote, dan alle chars daartussen verpakken in een string totdat je weer een quote tegenkomt. Dan de string in een nieuwe string array zetten en zoeken naar het volgende quote en weer opnieuw beginnen. Dit zou uiteindelijk een string[] moeten opleveren met alle waarden van 1 rij.
Ja dit zou inderdaad een optie kunnen zijn, maar waar ik dan weer tegen aan loop. Is dat bij mij, in Office 2007, Excel er geen quotes bij zet wanneer er of geen data in een veld zit of de data numeriek is. :|

:)

  • roy-t
  • Registratie: Oktober 2004
  • Laatst online: 17-10 16:43
WasBak schreef op maandag 25 augustus 2008 @ 15:29:
[...]


De kans is heel erg klein, maar wel mogelijk.


[...]


Ja dit zou inderdaad een optie kunnen zijn, maar waar ik dan weer tegen aan loop. Is dat bij mij, in Office 2007, Excel er geen quotes bij zet wanneer er of geen data in een veld zit of de data numeriek is. :|

:)
Arg er moet togen wel een standaard delimiter zijn ofzoiets? Anders kan het bestand toch ook nooit meer ingelezen worden, wordt er niet een bepaald niet leesbaar karakter gebruikt?

~ Mijn prog blog!


  • justice strike
  • Registratie: Juni 2001
  • Laatst online: 07:24
eigen splitfunctie maken. Maar het wordt bijzonder lastig om zoiets voor elkaar te krijgen. Is het niet mogelijk om de delimiter een komma en een spatie te laten zijn oid?

in iedergeval moet je weten of je een vast aantal kollomen hebt en/of je altijd een komma hebt bij een bepaalde kollom.

is dit niet het geval dan wordt het wel erg lastig.

U can call me sir.... or justice as long as u bow down ;)


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

WasBak schreef op maandag 25 augustus 2008 @ 15:29:
[...]

De kans is heel erg klein, maar wel mogelijk.
Dan heb je een probleem. Hoe verwacht jij dat je programma gaat zien of bla1, bla2, bla3, bla4, bla5, bla6, bla7 zo in kolommen opgedeeld moet worden:
  1. bla1
  2. bla2, bla3
  3. bla4, bla5
  4. bla6
  5. bla7
of zo:
  1. bla1, bla2, bla3
  2. bla4
  3. bla5
  4. bla6
  5. bla7
of een van de andere talloze mogelijkheden? Je kan hier geen logica voor maken en zal dus echt een andere delimiter moeten kiezen óf in zijn geheel af moeten zien van CSV's.
justice strike schreef op maandag 25 augustus 2008 @ 15:46:
eigen splitfunctie maken. Maar het wordt bijzonder lastig om zoiets voor elkaar te krijgen. Is het niet mogelijk om de delimiter een komma en een spatie te laten zijn oid?
Daarmee los je het probleem niet op, je verplaatst het alleen. Je mag dan in plaats van "," geen ", " in je kolom hebben staan. En laat dat in normaal Nederlands (of Engels, Duits, enz.) nou de meest gangbare manier van kommagebruik zijn... ;)

[ Voor 29% gewijzigd door NMe op 25-08-2008 15:49 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • WasBak
  • Registratie: September 2000
  • Niet online
roy-t schreef op maandag 25 augustus 2008 @ 15:40:
[...]
Arg er moet togen wel een standaard delimiter zijn ofzoiets? Anders kan het bestand toch ook nooit meer ingelezen worden, wordt er niet een bepaald niet leesbaar karakter gebruikt?
Ja dat is dus de komma, als Excel een export maakt, zet het er dus quotes omheen als er een komma in staat. Wanneer Excel er precies quotes in worden gezet is me nog niet helemaal duidelijk.. maar dan negeert Excel dus de komma.

^ Misschien is dit dus de enige manier..

@justice strike
Ja het zijn gelukkig wel altijd een vast aantal kolommen
-NMe- schreef op maandag 25 augustus 2008 @ 15:48:
[...]
of een van de andere talloze mogelijkheden? Je kan hier geen logica voor maken en zal dus echt een andere delimiter moeten kiezen óf in zijn geheel af moeten zien van CSV's.
Dat dacht ik dus ook, en dat wilde ik dus eigenlijk ook voorstellen. Maar nu weet ik het dus eigenlijk wel zeker.

Bedankt!

Verwijderd

Je kan toch splitten op een regular expression? Moet volgens mij niet moeilijk zijn om te splitten op , en niet op ",".

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Goed. En hoe los je dan het probleem op dat ik in mijn vorige post aankaart? :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 13-09 00:05
Simpel: in jouw eerste voorbeeld is de input bla1, bla2"," bla3, bla4"," bla5, bla6, bla7 en in het tweede geval bla1"," bla2"," bla3, bla4, bla5, bla6, bla7. Er zijn dus altijd 5 komma's zonder quotes, en daar splits je.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Ah, Excel zet er juist wél quotes omheen? Die zin heb ik verkeerd gelezen dan. :) In dat geval is het inderdaad wel mogelijk.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • kunnen
  • Registratie: Februari 2004
  • Niet online
Je kunt gewoon splitten op de komma, en dan per element van de result-array kijken of die met een " begint, en wanneer dit zo is merge je die met alle volgende elementen totdat er een eindigt op een ".

  • pedorus
  • Registratie: Januari 2008
  • Niet online
MSalters schreef op maandag 25 augustus 2008 @ 16:34:
Simpel: in jouw eerste voorbeeld is de input bla1, bla2"," bla3, bla4"," bla5, bla6, bla7 en in het tweede geval bla1"," bla2"," bla3, bla4, bla5, bla6, bla7. Er zijn dus altijd 5 komma's zonder quotes, en daar splits je.
Excel quote toch echt de hele string in een cel. Maar dan nog kan het wel met RegExp:
C#:
1
2
3
System.Text.RegularExpressions.Regex.Split(
    "\"vreemde\"\"col,1\",\"col,2\",col3",
    "(?<=^[^\"]*(?:(?:\"[^\"]*){2})*),");


(Oftewel: pak komma's met daar voorafgaand een even aantal keer het teken ".) Vervolgens moet je dan de strings unquoten indien nodig, en "" vervangen door ". Ik zou het enkel niemand aanraden.

Kortom: parsen is een veel beter idee dan regexp, en gaat vast een stuk sneller als het wat groter wordt :) [google=csvreader c#] ofzoiets dus :)

[ Voor 22% gewijzigd door pedorus op 25-08-2008 18:05 ]

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


  • DigiK-oz
  • Registratie: December 2001
  • Laatst online: 09:42
Maar als je nou eerst split op de aanhalingstekens? Alle even kolommen die je vindt (1-based) zijn data (eventueel met komma's). Alle oneven kolommen die je vindt moet je nog een keer splitten op komma's.

Of...?

Whatever


  • kenneth
  • Registratie: September 2001
  • Niet online

kenneth

achter de duinen

Look, runners deal in discomfort. After you get past a certain point, that’s all there really is. There is no finesse here.


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
je kan toch een heel simpel loopje maken

C#:
1
2
3
4
5
6
7
8
9
10
11
12
bool inString = false;
for(int i=0; i < myString.Length; i++)
{
    if(myString[i] == '"')
        inString != inString;
    else if( !inString && myString[i] == ',' )
        SplitHere();
}
if( inString )
{
    throw new MalFormedCSVException();
}

Dan moet je alleen nog even "unquoten".

[ Voor 17% gewijzigd door Woy op 25-08-2008 22:03 ]

“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.”


Verwijderd

Dat unquoten kun je ook in SplitHere() doen, maar wel eens met rwb: een simpele parser/state machine is hier een stuk handiger dan een regex.

  • WasBak
  • Registratie: September 2000
  • Niet online
pedorus schreef op maandag 25 augustus 2008 @ 18:03:
[...]
Kortom: parsen is een veel beter idee dan regexp, en gaat vast een stuk sneller als het wat groter wordt :) [google=csvreader c#] ofzoiets dus :)
Klant wilde toch een komma gebruiken en een regex wilde het niet altijd voorelkaar krijgen.

Maar de CSVReader van CodeProject is het wel gelukt. :)
Pagina: 1