2016-01-06 3 views
2

J'ai récemment appris TextFieldParser à analyser words où précédemment j'utiliserais string.Split pour le faire. Et j'ai une question concernant le nouvellement appris class.StringSplitOptions.RemoveEmptyEntries équivalent pour TextFieldParser

Si nous analysons un message comme celui-ci en utilisant string.Split avec StringSplitOptions.RemoveEmptyEntries

string message = "create myclass \"56, 'for better or worse'\""; //have multiple spaces 
string[] words = message.Split(new char[] { ' ' }, 3, StringSplitOptions.RemoveEmptyEntries); 

Ensuite, nous allons obtenir words qui contiennent trois éléments comme celui-ci:

[0] create 
[1] myclass 
[2] "56, 'for better or worse'" 

Mais si nous le faisons avec TextFieldParser

string str = "create myclass \"56, 'for the better or worse'\""; 
var parser = new Microsoft.VisualBasic.FileIO.TextFieldParser(new StringReader(str)); //treat string as I/O 
parser.Delimiters = new string[] { " " }; 
parser.HasFieldsEnclosedInQuotes = true; 
string[] words2 = parser.ReadFields(); 

Le return consistera en une words sans texte

[0] create 
[1] 
[2] 
[3] 
[4] myclass 
[5] 
[6] 
[7] "56, 'for better or worse'" 

maintenant est là de façon équivalente pour enlever le vide words dans le tableau résultant comme string.SplitStringSplitOptions.RemoveEmptyEntries fait?

+0

Cela ne semble pas un fichier CSV. Pourquoi voudriez-vous utiliser le [beaucoup plus lent] (http://stackoverflow.com/a/20456597/2316200) VB6 TextFieldParser au lieu de String.Split ou un Regex? –

+0

@ Pierre-LucPineault Je ne sais pas si cela est normalement utilisé pour (seulement pour) le texte CSV, monsieur. Mais dans ma question précédente, deux personnes réputées me suggèrent d'utiliser ceci pour analyser mon texte et avec une meilleure performance. Depuis que je suis nouveau, j'ai fait confiance à leur jugement et l'utilise. Voici le post: http://stackoverflow.com/questions/34607051/parse-string-with-whitespace-and-quotation-mark Je serais heureux si vous pouviez donner une vision alternative – Ian

+0

@ Pierre-LucPineault J'ai ouvert le lien vous avez donné et lu la différence de temps! Comment cela peut-il être! Voir le lien que je donne. L'opinion là-bas est assez différente. – Ian

Répondre

1

Peut être ce ferait l'affaire

parser.HasFieldsEnclosedInQuotes = true; 
string[] words2 = parser.ReadFields(); 
words2 = words2.Where(x => !string.IsNullOrEmpty(x)).ToArray(); 

Alternative Une doublure pourrait être

string[] words2 = parser.ReadFields().Where(x => !string.IsNullOrEmpty(x)).ToArray(); 
+0

Merci pour votre réponse rapide, Monsieur. Mais cela ne semble pas fonctionner. J'ai l'idée que je pourrais utiliser 'LINQ' cependant. – Ian

+0

Je supprimer la garniture et utiliser! String.IsNullOrWhiteSpace (tag) –

+0

@MohitShrivastava Merci, cela fonctionne bien. – Ian