2010-12-08 5 views
1

i ai suivante chaîne:Une expression régulière pour correspondre à une patte qui ne sont pas entourés par des guillemets

ID Table 1 Table 2 
1 "Column 1 Column 2 Column 3 
1 2 3 
4 5 6 
7 8 9" "Column A Column B Column C 
a b c 
d e f 
g h i" 

La première ligne contient les ColumnHeaders (ID, Tableau 1, Tableau 2). La ligne de séparation des données.

La chaîne est copiée par le presse-papier à partir de cette feuille Excel-: http://i.stack.imgur.com/5lwaT.png

Les colonnes sont séparées par \ t, ligne par \ r \ n. B2 et C2 sont des tables. Ses Columns et Row sont également représentés par \ t et \ r \ n. Chaque tableau est entouré de guillemets.

Maintenant, je diviser la ligne:

Dim rows() as String 
Regex = New Regex("\r\n") 
rows = Regex.Split(MyString) 

qui retourne:

ID Table 1 Table 2 

et

1 "Column 1 Column 2 Column 3 
1 2 3 
4 5 6 
7 8 9" "Column A Column B Column C 
a b c 
d e f 
g h i" 

Maintenant, je dois diviser les lignes, mais je besoin d'un modèle qui retourne chaque onglet qui n'est pas entouré de guillemets.

Quelqu'un peut-il m'aider avec la regex?

Merci :)

+0

vous devriez vraiment vérifier cet article http://secretgeek.net/csv_trouble.asp – Andrey

Répondre

0

J'utilise pour mes fichiers CSV, mais devrait, avec quelques ajustements mineurs, obtenir à travailler avec délimité par des tabulations ainsi:

Regex rExp = new Regex(@"(?:^|\x09)(\""(?:[^\""]+|\"\")*\""|[^\x09]*)"); 

Et pour référence, CSV Regex:

Regex rExp = new Regex(@"(?:^|,)(\""(?:[^\""]+|\""\"")*\""|[^,]*)"); 

Veuillez ne pas capturer les citations environnantes.

EDIT

Peut-être que je suis trop présumer, mais il semble que vous essayez d'obtenir les valeurs et qui se faire prendre sur le delimiter. Cela va capturer les valeurs dans les délimiteurs.

EDITv2

cordes verbatim occasion

+0

qu'en est-il de l'utilisation de chaînes verbatim? cela réduira considérablement le nombre de caractères dans la chaîne – Andrey

+0

Est-ce plus satisfaisant? ;-) –

+0

comment cela fonctionne avec les chaînes verbatim? –

0

Parce que je suis trop fatigué pour penser à une bonne réponse, voici un hack une place. Si vous pouvez être sûr que les guillemets sont appariés, vous pouvez le pirater facilement en trois étapes:

  1. Trouvez les onglets qui sont dans les guillemets et permutez-les.
  2. Séparer les onglets
  3. Remettez les onglets réels.

comme ceci:

// JS psuedo-code 
str = str.replace(/("[^"]*)\t([^"]*")/g, '$1ëïÒ$2'); 
pieces = str.split(/\t/); 
for (var i=0,len=pieces.length;i<len;++i){ 
    pieces[i] = pieces[i].replace(/ëïÒ/g, "\t"); 
} 

La partie horrible hack de ce utilise une chaîne de remplacement que vous pouvez espérer ne se produira jamais naturellement.

0

Ce que vous essayez de faire est de créer votre analyseur CSV (remplacer la virgule par un onglet dans votre cas). Il ya un bon article sur pourquoi vous ne devriez pas faire ceci: http://secretgeek.net/csv_trouble.asp J'ai essayé une fois d'écrire mon propre analyseur mais j'ai arrêté parce que ce n'est vraiment pas si facile. Check this free one. Cela m'a sauvé quelques heures.

+0

Tant qu'il est conforme à la syntaxe correcte, un analyseur n'est pas trop difficile. Le problème est que la plupart des gens qui exportent vers CSV ne connaissent pas les mises en garde (enchaîne des virgules avec des guillemets, échappe des citations entre guillemets, encapsule des valeurs multi-lignes entre guillemets, etc.) –

+0

@Brad Christie consomme du temps qui peut facilement être sauvé. – Andrey

Questions connexes