Mehr

Fehler beim Hinzufügen einer Zeile - Sequenzgröße muss mit Zeilengröße übereinstimmen


Ich habe diese Tabelle mit einer Zeile

timestamp_pretty 3.1.2014 9:13 timestamp 1,38874E+12 msgstr 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 Monate 1 Woche 1 imo 8404446 Land Belgien Name SCHNELL JULIA

Ich möchte mit dem Einfügecursor eine Point-Feature-Class aus arcpy erstellen:

# csv lesen csv.register_dialect("xls", lineterminator="
") f = open(incsv, "r") reader = csv.reader(f, dialect = "xls") # Felder zu fc desc = . hinzufügen arcpy.Describe(incsv) für Feld in desc.fields: arcpy.AddField_management(outfc,field.name,field.type) # the fieldnames fields = desc.fields fieldnames = [field.name for field in fields] # InsertCursor erstellen. cursor = arcpy.da.InsertCursor(outfc, ['[email protected]'] + fieldnames) count = 0 next(reader, None) # Überspringe die Kopfzeile für Zeile im Reader: if count % 10000 == 0: drucke "Verarbeitungszeile" {0}".format(count) + " of " + table Ycoord = row[5] Xcoord = row[6] newrow = [(float(Xcoord), float(Ycoord))] + row[0:] Cursor. insertRow([newrow]) count += 1 del Cursor f.close()

Aber ich bekomme diesen Fehler:

Zeile 130, in  cursor.insertRow([newrow]) TypeError: Sequenzgröße muss der Zeilengröße entsprechen

Ich habe SE ähnliche Antworten durchgemacht und viele Tests (Tage) durchgeführt, aber ohne Erfolg.

****BEARBEITEN****

Wenn ich das Ergebnis von newrow und row[0:] wie folgt ausdrucke:

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

*BEARBEITEN 2 * Name und Typ zum Erstellen von Feature-Classes verwenden

[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'draft', u'dimPort', u'dimStarboard', u'dimStern', u'month', u'week' , u'imo', u'Land', u'Name'] [u'Datum', 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'Integer', u'Integer', u'Integer', u'Integer', u'String', u'String']

Ich bekomme dieses Ergebnis:

neue Zeile: [(14.580546, 53.4346), '01.03.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', 'Belgien', ' FAST JULIA'] Zeile[0:]: ['01.03.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', 'Belgien', 'SCHNELLE JULIA']

Ich jetzt, newrow hat 22 Felder (die Koordinaten am Anfang gezählt) und row[0:] hat 21. Ist das der Fehler? Wenn ja, warum hat es in dem Originalskript funktioniert, das ich von @John bekommen habe?


All dieser Code ist übertrieben, Sie können Ihre gesamte Tabelle mit dem Werkzeug XY-Ereignisebene erstellen in einer Codezeile in eine Ebene konvertieren! Sehen Sie sich das Codebeispiel auf der Hilfeseite des Tools an.

Wenn das Dataset dauerhaft sein soll, können Sie das Werkzeug Features kopieren verwenden, eine weitere Codezeile!

Diese können im Modelbuilder aneinandergereiht oder aus einem Python-Skript heraus aufgerufen werden.


  1. erste einfache Lösung: Texttyp erzwingen

    # csv lesen csv.register_dialect("xls", lineterminator="
    ") f = open(incsv, "r") reader = csv.reader(f, dialect = "xls") # Felder zu fc desc = . hinzufügen arcpy.Describe(incsv) for field in desc.fields: arcpy.AddField_management(outfc,field.name,"TEXT") #force text format # the fieldnames fields = desc.fields fieldnames = [field.name for field in fields] # InsertCursor erstellen. Cursor = arcpy.da.InsertCursor(outfc, ['[email protected]'] + fieldnames) count = 0 # TODO: Feldzeilen-Positionsdetektorfunktion erstellen mit Ignorieren von Groß-/Kleinschreibung # check_x = ['x','lng', 'long', 'longitude'] and other use # check_y = ['y','lat', 'latitude'] and other use next(reader, None) # Überspringe die Kopfzeile der Zeile im Reader: if count % 10000 == 0: print "processing row {0}".format(count) + " of " + table Ycoord = row[5] # setze Zeile mit Positionsdetektor Xcoord = row[6] # setze Zeile mit Positionsdetektor newrow = [(float(Xcoord) , float(Ycoord))] + row[0:] cursor.insertRow(newrow) # hier ändern keine doppelte Liste hinzufügen und tuple übergeben : tuple(newrow) if row is  count += 1 del Cursor f.close()