2012-05-23 4 views
2

J'ai cette chaîneJava découpant une chaîne

G234101,Non-Essential,ATPases,Respiration chain complexes,"Auxotrophies, carbon and",PS00017,2,IONIC HOMEOSTASIS,mitochondria. 

que j'ai essayé de diviser en java. Le fichier est délimité par une virgule, mais certaines chaînes comportent des virgules et je ne veux pas qu'elles soient divisées. Actuellement dans l'exemple ci-dessus

"Auxotrophies, carbon and" 

est divisé en deux chaînes.

Toutes les suggestions sur la meilleure façon de diviser cela par des virgules. Pas toutes les chaînes ont la « » par exemple la chaîne suivante:

G234103,Essential,Protein Kinases,?,Cell cycle defects,PS00479,2,CELLULAR COMMUNICATION/SIGNAL TRANSDUCTION,cytoplasm. 
+0

vous devriez décider d'utiliser regex. – Sajmon

+1

C'est pourquoi les encodages de caractères sont utilisés. Ne le placez pas entre guillemets, changez la virgule en quelque chose comme% 2C, puis décodez après. – Vetsin

+0

Pouvez-vous choisir un délimiteur qui n'est pas une virgule? comme un "|" – nsfyn55

Répondre

2

http://opencsv.sourceforge.net/

Mais si vous avez vraiment besoin de réinventer la roue (devoirs), vous devez utiliser une expression régulière plus compliquée que simplement "quoi, jamais" .split (","). It's not simple though. Et vous pourriez être mieux de créer votre propre Lexer personnalisé. http://en.wikipedia.org/wiki/Lexical_analysis

Ce n'est pas trop dur dans votre cas. Au fur et à mesure que vous traitez votre texte par caractère, vous avez juste besoin de garder une trace des guillemets d'ouverture et de fermeture pour décider quand ignorer les virgules et quand agir dessus.

Voir aussi StreamTokenizer pour un Lexer intégré configurable - vous devriez pouvoir l'utiliser pour répondre à vos besoins.

+0

+1 Un analyseur CSV existant est la seule réponse raisonnable pour cette tâche, sauf si elle est –

1

Je pense que ce serait un processus en plusieurs étapes. Tout d'abord, trouvez toutes les virgules entre guillemets de votre chaîne d'origine, remplacez-la par quelque chose comme {virgule}. Vous pouvez le faire avec quelques regex. Ensuite, sur la nouvelle chaîne, divisez la nouvelle chaîne avec le symbole virgule (,). Ensuite, parcourez votre liste et remplacez la {virgule} par le symbole virgule {,}.

+0

Que faire si le texte dans l'une des colonnes CSV contient le littéral '{virgule}'? Remplacer la virgule ne résout pas réellement le problème.Il pourrait rendre le problème moins probable, mais c'est un hack. – Chii