Supprimer le caractère retour / nouvelle ligne (\ n) de Field à l'aide de Python et de Field Calculator?

14

J'ai une table de géodatabase avec un champ que j'essaie de supprimer les caractères de retour (nouvelle ligne). J'ai trouvé ce post ( comment puis-je supprimer (chomp) une nouvelle ligne en Python? ) De la façon de le faire, mais il ne fonctionne pas dans la calculatrice de champ. Voici les extraits de code que j'ai essayés: Remarque : le caractère de retour n'est pas à la fin de la chaîne .

!myField!.rstrip()

OU

!myField!.rstrip('\n')

OU

!myField!.rstrip('\r\n')

OU

!myField!.replace('\n', '')

000539 erreur donnée pour cette option:

Description Le calcul utilisé par l'outil Calculer le champ ou Calculer la valeur n'est pas valide. Ce message d'erreur fourni répertorie l'erreur Python spécifique.

Solution Ce code d'erreur couvre un certain nombre d'erreurs Python:

Exemple d'erreur 1: exceptions.TypeError: impossible de concaténer les objets 'str' et 'int'. Ce qui précède est une erreur spécifique à Python. Le calcul tente d'ajouter ou de concaténer une chaîne et un nombre.

Exemple d'erreur 2: forme de champ non valide à distance Ce qui précède est une erreur d'utilisation de l'objet géométrique. La méthode de distance n'est pas une méthode valide de l'objet géométrique.

Pour des problèmes spécifiques à Python, consultez l'aide Python externe pour plus d'informations, ou consultez l'aide Calculer un champ ou Calculer une valeur pour plus d'informations sur ces outils.

OU

import os
def removeReturn(myField):
  s = myField.rstrip(os.linesep)
  return s

Des idées sur la façon de supprimer les caractères de retour à l'aide de la calculatrice de champ?

oeuvre21
la source
Êtes-vous sûr qu'il s'agit d'un caractère de nouvelle ligne ("\ n")? Serait-il possible que ce soit un retour chariot ("\ r") à la place? En outre, toutes les valeurs de toutes les lignes sont-elles alpha, ou peut-être son échec sur une valeur numérique dans l'un des champs? . Peut - être str (! MyField) rstrip ( '\ n')
RyanKDalton
Veuillez poster la trace complète de Python avec le message d'erreur et le numéro de ligne, et non l'erreur ArcGIS que vous obtenez (qui est générique et inutile).
blah238
Cela commence à ressembler à quelque chose dans ArcGIS lui-même, car les différentes réponses Python données sont toutes correctes.
Cindy Jayakumar
Obtenez-vous une SyntaxError: EOL while scanning string literalerreur?
blah238
Je ne sais pas comment la calculatrice gère l'importation des modules, mais vous pouvez également essayer: importer re et utiliser re.sub.
Tomek

Réponses:

9

Je pense que ce n'est qu'un bug / limitation de l'analyseur Python avec l'outil de calculatrice de champ / Calculer le champ. Si une nouvelle ligne est rencontrée dans le champ de texte, une SyntaxError: EOL while scanning string literalse produit, peu importe ce que vous essayez.

Je peux reproduire le problème dans 10.1 SP1 en important le fichier CSV suivant dans une géodatabase fichier, en ajoutant un champ et en essayant simplement de copier le Textchamp dans le nouveau champ à l'aide de la calculatrice de champ avec l'analyseur Python et et l'expression !Text!.

ID, texte
1, "ceci est un multiligne 
exemple"

Essayez de basculer vers l'analyseur VB ou d'utiliser un UpdateCursoret d'éviter complètement la calculatrice de champ.

Cette question est également discutée sur les forums ESRI, avec les mêmes conclusions:

Le seul NIM pertinent que j'ai pu trouver était le suivant:

  • NIM085499 - Les calculs CalculateField utilisant des caractères non ASCII échouent sur un moteur Linux avec: "ERREUR 000539: SyntaxError: EOL lors de l'analyse du littéral de chaîne (, ligne 1)".
blah238
la source
4

Il y a deux solutions possibles que j'ai trouvées fiables. Pour une raison quelconque, CartoPac permet aux gens de mettre un retour dans le champ REMARQUES où je travaille. Pour s'en débarrasser, la solution que j'ai trouvée la plus efficace consiste à utiliser la calculatrice de champ.

Changez votre analyseur en Python. Mettez ce qui suit dans le code de script pré-logique:

def carriageReturnRemoval(remark):
    remark = remark.splitlines()
    separator = " -- "
    return separator.join(remark)

Mettez ce qui suit dans la zone de texte suivante (celle-ci fonctionne sur un champ appelé REMARQUES):

carriageReturnRemoval( !REMARKS! )

entrez la description de l'image ici

Lorsque votre retour chariot sera supprimé, il ajoutera un espace, - et un espace entre chaque ligne. Vous pouvez modifier "-" en un autre caractère ou ensemble de caractères si vous le souhaitez. Mais j'ai trouvé que cela fonctionnait le mieux pour moi en fonction de la façon dont mes équipes de construction saisissaient les données. Il est plus facile de faire des opérations de recherche / remplacement s'il existe des modèles de caractères reconnaissables brisant chaque retour chariot, qu'ils utilisent dans le champ pour désigner un nouvel attribut (même s'il s'agit souvent d'un attribut qu'ils auraient pu simplement mettre dans le champ approprié et m'a sauvé le mal de tête en premier lieu).

Si vous préférez utiliser la console Python dans ArcGIS, vous pouvez modifier ce qui précède pour fonctionner. Cependant, j'ai également essayé cela avec un certain succès dans la console Python:

rows = arcpy.UpdateCursor("Assets\Welds")  
for row in rows:  
    hexString = str(row.REMARKS).encode("hex")  
    if "0a" in hexString:  
        hexString = hexString.replace("0a","")  
        row.REMARKS = hexString.decode("hex")  
        rows.updateRow(row)  

Remplacez "Assets \ Welds" par le nom fc approprié et remplacez row.REMARKS par row. (Insérez le nom du champ ici)

Vous pouvez ou non avoir besoin d'exécuter les lignes d'importation ci-dessous avant d'essayer l'exemple de code ci-dessus:

import arcpy  
import string
Zachary Ordo - GISP
la source
Je lui donne un coup de feu, votre déclaration après votre déclaration if doit être mise en retrait.
artwork21
Bonne capture ... il n'a pas copié correctement lorsque j'ai copié à partir du script de la fenêtre de commande Python.
Zachary Ordo - GISP
4

La solution à ce problème, car ma table de classes d'entités est originaire d'Excel, était d'utiliser la commande Excel suivante:

= PROPRE

pour supprimer tous les caractères de retour ou de nouvelle ligne. Vous pouvez ensuite joindre ou importer la table dans votre base de données SIG.

oeuvre21
la source
3

J'ai utilisé une instruction SQL pour sélectionner d'abord les nouveaux caractères de ligne. Dans la Select By Attributesfenêtre de dialogue:

"MY_FIELD" LIKE '%
 %'

Vous devez appuyer Enteraprès le premier%.

Cindy Jayakumar
la source
2
Je viens de réaliser que même si cela me montrait où se trouvaient les nouveaux caractères de la ligne, je ne pouvais pas non plus MY_FIELD.strip()travailler, mais comme je n'avais que 5 enregistrements, je les ai modifiés manuellement.
Cindy Jayakumar
Vous pouvez probablement les sélectionner comme ceci, puis utiliser la calculatrice de champ pour recalculer les valeurs avec l'expression Python !MY_FIELD![:-1]- la tranche de chaîne devrait supprimer le caractère de nouvelle ligne (en supposant que rien ne vient après la nouvelle ligne, ce qui semble être le cas pour l'OP) .
nmpeterson
3

!FieldName!.replace(chr(10), "").replace(chr(13), "")

La calculatrice de champ est un peu confuse quand il s'agit d'échapper des séquences comme \net \t. Utilisez simplement les codes de caractères bruts.

Jason Scheirer
la source
Toujours SyntaxError: EOL while scanning string literalavec ça. L'analyseur VB fonctionne bien.
blah238
Dans l'expression et non dans le bloc de code? Et seulement sur 10.0?
Jason Scheirer
Dans l'expression, sur 10.1 SP1.
blah238
2
myString = "My text\n"

print myString.strip()
Dan
la source
cela ne fonctionnait pas dans la calculatrice de terrain.
artwork21
Avez-vous besoin d'une solution Python ou d'une solution VBA (ArcGIS 9)? strip (), rstrip () et lstrip () ne traitent que les caractères aux extrémités. S'il se trouve au milieu d'une chaîne, essayez .replace ("\ n", "")
Dan
Oui, j'ai besoin d'une solution python dans la calculatrice de terrain. Le retour est dans la chaîne et non à la fin. J'ai essayé .replace ("\ n", ""), mais j'ai eu une erreur générale 000539.
artwork21
Quelle est l'erreur Python spécifique donnée avec ce numéro?
Dan
Message d'erreur posté dans ma question.
artwork21
2

Je pense que cela devrait fonctionner en tant que code de script pré-logique dans la calculatrice de champ - mais malheureusement cela ne semble pas. Je l'ai quand même posté au cas où cela vous donnerait une approche alternative que vous pouvez modifier pour commencer à travailler.

def fix(teststring):
    parts = teststring.splitlines()
    newtest = ""
    for part in parts:
        newtest+=part
    return newtest
PolyGeo
la source
2

Essayez d'encapsuler votre !field!déclaration dans l'expression avec des guillemets et un initialiseur de chaîne brut , par exemple r"!field!".

Essayez str(!field!)aussi.

blah238
la source
Ça ne marche pas. J'ai également essayé l' MYFIELD.replace(r"\n",""), but it doesn't see that I've escaped the newline character, it just fails with a erreur EOL`.
Cindy Jayakumar
Vous avez raison, voyez mon autre réponse. Laissant celui-ci pour la postérité.
blah238