2009-06-06 7 views
3

Comment séparer la chaîne suivante?Séparer les chaînes CSV

test, 7535, '1,830,000', '5,000,000' 

Le résultat devrait être

test 
7535 
'1,830,000' 
'5,000,000' 

J'essaie:

Dim S() as string = mystring.split(",") 

Mais je reçois,

test 
7535 
'1 
830 
000' 
'5 
000 
000' 

Merci

Répondre

8

Ne pas analyser CSV manuellement lorsque vous avez à portée de main good quality libraries available. S'il vous plaît!

L'analyse CSV comporte de nombreux pièges potentiels et cette bibliothèque, d'après mes tests, résout la plupart d'entre eux.

Cela dit, si cela est une tâche hors et les cordes sont toujours comme votre exemple, vous pouvez utiliser regex, comme celui-ci (syntaxe VB.NET pourrait être erroné, s'il vous plaît fixer):

 Dim s as string = "1, 2, '1,233,333', '8,444,555'"; 
     Dim r as Regex = new Regex(",\s"); 
     Dim re() as string = r.Split(s); 

Cela compte sur le fait qu'il y a toujours un espace après la virgule séparatrice et qu'il n'y a pas d'espace entre les nombres dans les virgules. Si ce n'est pas toujours le cas, vous pouvez:

  • Faire la regex plus complexe (regarder here voir comment les choses désordonnées pourraient obtenir)
  • Utilisez la bibliothèque et être plus heureux
+1

Je ne suis pas d'accord sur la nécessité d'utiliser nécessairement une bibliothèque CSV. Si vous savez que le fichier CSV est bien formaté, une méthode simple utilisant ReadLine et Split fera parfaitement l'affaire. – Noldorin

+0

Cependant, dans cette situation, il est en effet conseillé, étant donné qu'il existe des nombres délimités par des virgules dans les champs. – Noldorin

+2

Donc, en d'autres termes, vous dites que vous êtes tout à fait d'accord avec moi :) –

1
Dim words as New List(Of String)() 
Dim inQuotes as Boolean 
Dim thisWord as String 
For Each c as Char in String 
    If c = "'"c Then inQuotes = Not inQuotes 
    If c = ","c AndAlso Not inQuotes Then 
     words.Add(thisWord) 
     thisWord = Nothing 
    Else 
     thisWord &= c 
    End If 
Next 
0

Essayez pour utiliser ce RegExp: "('([^']|'')*'|[^',\r\n]*)(,|\r\n?|\n)?"

1

Si juste pour cet exemple, pas besoin d'utiliser regexp, la fonction Split (Membre de Microsoft.VisualBasic.Strings) peut prendre une chaîne comme délimiteur, il suffit d'entrer "," pour attraper seulement les virgules avec l'espace après:

Dim s As String = "1, 2, '1,233,333', '8,444,555'" 
    Dim r() As String = Split(s, ", ") 
Questions connexes