Suite

Erreur lors de l'ajout de la ligne - la taille de la séquence doit correspondre à la taille de la ligne

Erreur lors de l'ajout de la ligne - la taille de la séquence doit correspondre à la taille de la ligne


J'ai ce tableau avec une ligne

timestamp_pretty 3.1.2014 9:13 timestamp 1,38874E+12 msgid 3 targetType A mmsi 205533000 lat 53.4346 long 14.580546 posacc 0 sog 0 cog 319.5 shipType CARGO dimBow 68 draft 4 dimPort 6 dimStarboard 5 dimStern 12 mois 1 semaine 1 imo 8404446 nom du pays Belgique JULIA RAPIDE

Je souhaite créer une classe d'entités ponctuelles à partir d'arcpy à l'aide du curseur d'insertion :

# Lire le csv csv.register_dialect("xls", linetermator="
") f = open(incsv, "r") reader = csv.reader(f, dialect = "xls") # Ajouter des champs à fc desc = arcpy.Describe(incsv) pour le champ dans desc.fields : arcpy.AddField_management(outfc,field.name,field.type) # les noms de champs champs = desc.fields fieldnames = [champ.nom du champ dans les champs] # Créer InsertCursor. curseur = arcpy.da.InsertCursor(outfc, ['[email protected]'] + fieldnames) count = 0 next(reader, None) # ignorer l'en-tête de la ligne dans le lecteur : if count % 10000 == 0 : print "processing row {0}".format(count) + " of " + table Ycoord = row[5] Xcoord = row[6] newrow = [(float(Xcoord), float(Ycoord))] + row[0:] curseur. insertRow([newrow]) count += 1 del curseur f.close()

Mais j'obtiens cette erreur :

ligne 130, dans  curseur.insertRow([newrow]) TypeError : la taille de la séquence doit correspondre à la taille de la ligne

J'ai traversé SE des réponses similaires et fait de nombreux tests (jours) mais en vain.

****ÉDITER****

Si j'imprime le résultat de newrow et row[0:] comme ceci :

newrow = [(float(Xcoord), float(Ycoord))] + row[0:] print "new row: "+str(newrow) print "row[0:]: "+str(row[0:])

*EDIT 2 * nom et type à utiliser pour créer une classe d'entités

[u'timestamp_pretty', u'timestamp', u'msgid', u'targetType', u'mmsi', u'lat', u'long', u'lat_D', u'long_D', u'posacc' , u'sog', u'cog', u'shipType', u'dimBow', u'draught', u'dimPort', u'dimStarboard', u'dimStern', u'month', u'week' , u'imo', u'country', u'name'] [u'Date', u'Double', u'Integer', u'String', u'Integer', u'String', u'String ', u'Double', u'Double', u'Integer', u'String', u'String', u'String', u'Integer', u'String', u'Integer', u'Integer ', u'Entier', u'Entier', u'Entier', u'Entier', u'Chaîne', u'Chaîne']

J'obtiens ce résultat :

nouvelle ligne : [(14.580546, 53.4346), '03/01/2014 09:13:26', '1388740406000', '3', 'A', '205533000', '53.4346', '14.580546', '0' , '0', '319.5', 'CARGO', '68', '4', '6', '5', '12', '01', '01', '8404446', 'Belgique', ' RAPIDE JULIA'] ligne[0:] : ['03/01/2014 09:13:26', '1388740406000', '3', 'A', '205533000', '53.4346', '14.580546', '0 ', '0', '319.5', 'CARGO', '68', '4', '6', '5', '12', '01', '01', '8404446', 'Belgique', 'JULIA RAPIDE']

Maintenant, newrow a 22 champs (en comptant les coordonnées au début) et row[0:] en a 21. Est-ce l'erreur ? Si oui, pourquoi cela a-t-il fonctionné dans le script original que j'ai reçu de @John ?


Tout ce code est exagéré, vous pouvez convertir l'intégralité de votre table en une couche à l'aide de l'outil Créer une couche d'événements XY, en une seule ligne de code ! Voir l'exemple de code sur la page d'aide de l'outil.

Si vous avez besoin que l'ensemble de données soit permanent, vous pouvez utiliser l'outil Copier les entités, une autre ligne de code !

Ceux-ci peuvent être enchaînés dans le constructeur de modèles ou appelés à partir d'un script python.


  1. première solution simple : forcer le type de texte

    # Lire le csv csv.register_dialect("xls", linetermator="
    ") f = open(incsv, "r") reader = csv.reader(f, dialect = "xls") # Ajouter des champs à fc desc = arcpy.Describe(incsv) pour le champ dans desc.fields : arcpy.AddField_management(outfc,field.name,"TEXT") #force text format # the fieldnames fields = desc.fields fieldnames = [field.name for field in fields] # Créer InsertCursor. curseur = arcpy.da.InsertCursor(outfc, ['[email protected]'] + noms de champs) count = 0 # A FAIRE : créer une fonction de détecteur de position de ligne de champ avec ignorer la casse # check_x = ['x','lng', 'long', 'longitude'] et autres utilisations # check_y = ['y','lat', 'latitude'] et autres utilisations next(reader, None) # ignorer l'en-tête de la ligne dans le lecteur : if count % 10000 == 0 : print "processing row {0}".format(count) + " of " + table Ycoord = row[5] # définir la ligne avec le détecteur de position Xcoord = row[6] # définir la ligne avec le détecteur de position newrow = [(float(Xcoord) , float(Ycoord))] + row[0:] cursor.insertRow(newrow) # changez ici n'ajoutez pas de double liste et préférez passer le tuple : tuple(newrow) si la ligne est  count += 1 del curseur f.close()