Je reçois la réponse d'un service ci-dessous. Comment analyser cela dans une carte Une option que j'ai pensée est de se diviser à WhitSpace TX = "000000000000108000001830001" FI = "" OS = "8" CI = "QU01SF1S2032" AW = "SSS" SA = "1525 CONCOURS DE VENTEUR" P> code>? J'ai d'abord pensé à Split à WhitSpace mais cela ne fonctionne pas car la valeur pourrait contenir des espaces par exemple. Regardez la valeur de la clé
3 Réponses :
Parse sur des citations. Vous pouvez même utiliser une expression régulière pour trouver chaque paire de clé / valeur, en supposant que chaque valeur est entre guillemets. Ma seule question serait, quelles sont les règles pour si une valeur contient des citations intégrées? (Sont-ils échappés à l'aide de '\' ou tel? Peu importe, il n'est pas actuellement pris en compte dans le ...)
Par exemple: P>
TX 0000000000108000001830001 FI OS 8 CI QU01SF1S2032 AW SSS SA 1525 Windward Concourse
Geez, utilisez simplement des guillemets simples; c'est marqué groovy :)
@Davenewton - Nous allons laisser cela comme un exercice pour l'OP. :-)
@ziesemer - +1. Mais je reçois la valeur après '=' imprimé avec des guillemets doubles comme "0000000000108000001830001"
@Pangea - parce que c'est ce qu'il est dans l'entrée. Qu'attendez-vous? "108000001830001"? Si tel est le cas, vous devrez l'analyser à un nombre - mais compte tenu de l'échantillon et des exigences de l'échantillon et des exigences ci-dessus, je ne sais pas comment vous détermineriez quelles valeurs doivent être traitées en tant que nombres et qui doivent être laissés manipulés comme des chaînes.
@ziesemer - J'ai posé la question parce que votre sortie de l'échantillon dans la réponse ne contient pas de guillemets doubles. Semble être dans le besoin d'utiliser la méthode de remplacement () pour éliminer les guillemets doubles
@ziesemer - il ne contient pas la double citation après la mise à jour du dernier code
console: p> code: p> StreamToletzerzer code>
est rapide, bien que je n'ai pas utilisé la fonctionnalité Quechat () Code>. Les exemples peuvent être trouvés ici , ICI et ici .
Bon à savoir sur StreamTokenizer
Je viens de avait i> pour essayer le quecechar () code>; plus ci-dessus.
Je pense que cette solution est trop compliquée. Sauf si il y a une contrainte de performance importante, je recommanderais d'aller avec une solution plus simple, comme en utilisant une regex (et si la performance est i> une contrainte, elle doit être profilée pour voir si cela est vraiment plus rapide qu'une regex , que je doute).
@épidémien: Oui, c'est pourquoi j'ai référencé un Benchmark .
Par l'apparence du texte, il semble que cela puisse être un XML. Est-ce que cela, ou est-ce que ce texte la réponse brute du service? Si c'est un XML, vous pouvez l'analyser facilement avec XMLSluper de Groovy:
def input = 'TX="0000000000108000001830001" FI="" OS="8" CI="QU01SF1S2032" AW="SSS" SA="1525 Windward Concourse"' def match = input =~ /(\w+)="([^"]*)"/ def map = [:] match.each { map[it[1]] = it[2] }
Vous pouvez également faire: def map = (correspondance comme liste) .CollectTries {[(IT [1]): IT [2]]} code>
@tim_yates Nice! J'ai essayé d'appeler Collecentries code> sur l'objet code> correspondant code>, mais il n'a pas cette méthode, uniquement les méthodes d'itération standard. Je n'ai pas pensé à la convertir en une liste code> code> d'abord. BTW, un
injecter code> peut aussi faire le truc = d