การลบอักขระ return / newline (\ n) ออกจาก Field โดยใช้ Python และ Field Calculator?


14

ฉันมีตารางฐานข้อมูลที่มีเขตข้อมูลที่ฉันพยายามลบอักขระที่ส่งคืน (บรรทัดใหม่) ฉันพบโพสต์นี้ ( ฉันจะลบ (chomp) ขึ้นบรรทัดใหม่ใน Python ได้อย่างไร ) ของวิธีการทำอย่างไร แต่มันไม่ทำงานภายในเครื่องคำนวณภาคสนาม นี่คือตัวอย่างโค้ดที่ฉันพยายามคือ ตัวละครหมายเหตุผลตอบแทนไม่ได้ในตอนท้ายของสตริง

!myField!.rstrip()

หรือ

!myField!.rstrip('\n')

หรือ

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

หรือ

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

ได้รับข้อผิดพลาด 000539 สำหรับตัวเลือกนี้:

คำอธิบายการคำนวณที่ใช้โดยเครื่องมือคำนวณเขตข้อมูลหรือคำนวณมูลค่าไม่ถูกต้อง ข้อความแสดงข้อผิดพลาดนี้จะแสดงรายการข้อผิดพลาด Python ที่เฉพาะเจาะจง

การแก้ไขรหัสข้อผิดพลาดนี้ครอบคลุมข้อผิดพลาดของ Python จำนวนหนึ่ง:

ตัวอย่างข้อผิดพลาด 1: ข้อยกเว้นประเภทข้อผิดพลาด: ไม่สามารถต่อกัน 'str' และวัตถุ 'int' ด้านบนเป็นข้อผิดพลาดเฉพาะของ Python การคำนวณพยายามเพิ่มหรือต่อสตริงและตัวเลขเข้าด้วยกัน

ตัวอย่างข้อผิดพลาด 2: รูปร่างฟิลด์ @ ระยะทางไม่ถูกต้องด้านบนเป็นข้อผิดพลาดในการใช้วัตถุรูปทรงเรขาคณิต วิธีการระยะทางไม่ใช่วิธีการที่ถูกต้องของวัตถุรูปทรงเรขาคณิต

สำหรับปัญหา Python ที่เฉพาะเจาะจงดูวิธีใช้ Python ภายนอกสำหรับข้อมูลเพิ่มเติมหรือศึกษาวิธีคำนวณฟิลด์หรือคำนวณมูลค่าของวิธีใช้สำหรับข้อมูลเพิ่มเติมเกี่ยวกับเครื่องมือเหล่านี้

หรือ

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

ความคิดใด ๆ เกี่ยวกับวิธีลบอักขระที่ส่งคืนโดยใช้เครื่องคิดเลข


คุณแน่ใจหรือว่าเป็นอักขระขึ้นบรรทัดใหม่ ("\ n") เป็นไปได้หรือไม่ที่จะเป็นสายการบินคืนสินค้า ("\ r") แทน นอกจากนี้ยังมีค่าทั้งหมดในทุกแถวอัลฟ่าหรืออาจจะล้มเหลวในค่าตัวเลขในหนึ่งในเขตข้อมูลหรือไม่ อาจเป็นไปได้ str (! myField!). rstrip ('\ n')
RyanKDalton

โปรดโพสต์การติดตาม Python แบบเต็มพร้อมข้อความแสดงข้อผิดพลาดและหมายเลขบรรทัดไม่ใช่ข้อผิดพลาด ArcGIS ที่คุณได้รับ (ซึ่งเป็นเรื่องทั่วไปและไม่ช่วยเหลือ)
blah238

มันเริ่มที่จะดูเหมือนกับอะไรบางอย่างใน ArcGIS เพราะคำตอบของ Python ที่หลากหลายนั้นถูกต้องทั้งหมด
ซินดี้ Jayakumar

คุณได้รับSyntaxError: EOL while scanning string literalข้อผิดพลาดหรือไม่?
blah238

ฉันไม่แน่ใจว่าเครื่องคิดเลขจัดการการนำเข้าโมดูลอย่างไร แต่คุณอาจลอง: นำเข้าใหม่และใช้ re.sub
Tomek

คำตอบ:


9

ฉันคิดว่านี่เป็นเพียงข้อผิดพลาด / ข้อ จำกัด ของ Parser Python พร้อมเครื่องมือคำนวณภาคสนาม / คำนวณภาคสนาม หากพบบรรทัดใหม่ภายในฟิลด์ข้อความ a SyntaxError: EOL while scanning string literalจะเกิดขึ้นไม่ว่าคุณจะพยายามทำอะไร

ฉันสามารถทำซ้ำปัญหาที่ 10.1 SP1 โดยการนำเข้าไฟล์ CSV ต่อไปนี้เป็นของ Geodatabase ไฟล์เพิ่มฟิลด์และก็พยายามที่จะคัดลอกTextข้อมูลไปยังเขตข้อมูลใหม่โดยใช้เครื่องคิดเลขฟิลด์กับ parser !Text!งูใหญ่และและการแสดงออก

ID ข้อความ
1 "นี่คือ multiline 
ตัวอย่าง"

ลองสลับไปใช้ตัวแยกวิเคราะห์ VB หรือใช้UpdateCursorและหลีกเลี่ยงเครื่องคำนวณภาคสนามโดยสิ้นเชิง

ปัญหานี้ยังถูกกล่าวถึงในฟอรัม ESRI ด้วยข้อสรุปเดียวกัน:

NIM ที่เกี่ยวข้องเท่านั้นที่ฉันสามารถค้นหาได้คือ:

  • NIM085499 - คำนวณการคำนวณฟิลด์โดยใช้อักขระที่ไม่ใช่ ASCII ล้มเหลวบนเอนจิ้น Linux ด้วย: "ข้อผิดพลาด 000539: SyntaxError: EOL ในขณะที่สแกนสตริงตามตัวอักษร (, บรรทัด 1)"

4

มีวิธีแก้ไขที่เป็นไปได้สองข้อที่ฉันพบว่าเชื่อถือได้ ด้วยเหตุผลบางอย่าง CartoPac ช่วยให้ผู้คนใส่ผลตอบแทนในช่องหมายเหตุที่ฉันทำงาน ในการกำจัดสิ่งเหล่านั้นทางออกที่ฉันพบว่าทำงานได้ดีที่สุดคือการใช้เครื่องคำนวณภาคสนาม

เปลี่ยน Parser ของคุณเป็น Python ใส่สิ่งต่อไปนี้ในรหัสสคริปต์ล่วงหน้า:

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

วางต่อไปนี้ในกล่องข้อความถัดไป (อันนี้ทำงานในเขตข้อมูลที่เรียกว่าหมายเหตุ):

carriageReturnRemoval( !REMARKS! )

ป้อนคำอธิบายรูปภาพที่นี่

เมื่อการรับคืนของคุณถูกลบออกมันจะเพิ่มช่องว่าง - และช่องว่างระหว่างแต่ละบรรทัด คุณสามารถแก้ไข "-" เป็นอักขระอื่นหรือชุดอักขระได้หากต้องการ แต่ฉันพบว่าสิ่งนี้ทำงานได้ดีที่สุดสำหรับฉันตามวิธีที่ทีมงานก่อสร้างของฉันป้อนข้อมูล มันง่ายกว่าที่จะทำการดำเนินการค้นหา / แทนที่หากมีรูปแบบของตัวละครที่เป็นที่รู้จักซึ่งทำให้การรับคืนแต่ละแคร่ซึ่งใช้ในฟิลด์เพื่อแสดงถึงคุณลักษณะใหม่ และช่วยให้ฉันปวดหัวตั้งแต่แรก)

หากคุณต้องการใช้ Python Console ใน ArcGIS คุณสามารถแก้ไขด้านบนเพื่อใช้งานได้ อย่างไรก็ตามฉันได้ลองทำเช่นนี้ด้วยความสำเร็จใน Python Console:

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)  

แทนที่ "Assets \ Welds" ด้วยชื่อ fc ที่เหมาะสมและแทนที่ row.REMARKS ด้วยแถว (แทรกชื่อฟิลด์ที่นี่)

คุณอาจหรืออาจไม่จำเป็นต้องเรียกใช้บรรทัดการนำเข้าด้านล่างก่อนลองตัวอย่างโค้ดด้านบน:

import arcpy  
import string

ฉันให้มันคำสั่งของคุณหลังจากถ้าคำสั่งของคุณต้องการเยื้อง
Artwork21

เยี่ยมมาก ... มันไม่ได้คัดลอกอย่างถูกต้องเมื่อฉันคัดลอกจากสคริปต์หน้าต่างคำสั่ง Python ที่ใช้งานได้
Zachary Ordo - GISP

4

การหลีกเลี่ยงสิ่งนี้เนื่องจากตารางคลาสคุณลักษณะของฉันที่สร้างขึ้นใน excel คือการใช้คำสั่ง excel ต่อไปนี้:

= CLEAN

วิธีการลบทั้งหมดกลับหรือตัวละครบรรทัดใหม่ จากนั้นคุณสามารถเข้าร่วมหรือนำเข้าตารางลงในฐานข้อมูล GIS ของคุณ


3

ฉันใช้คำสั่ง SQL เพื่อเลือกอักขระบรรทัดใหม่ก่อน ในSelect By Attributesหน้าต่างข้อความ:

"MY_FIELD" LIKE '%
 %'

คุณต้องกดEnterหลังจาก% แรก


2
ฉันเพิ่งรู้ว่าในขณะที่สิ่งนี้แสดงให้ฉันเห็นว่ามีอักขระบรรทัดใหม่อยู่ที่ไหนฉันก็ไม่MY_FIELD.strip()สามารถทำงานได้ แต่เนื่องจากฉันมีเพียง 5 ระเบียนฉันจึงแก้ไขด้วยตนเอง
ซินดี้ Jayakumar

คุณอาจเลือกได้เช่นนี้จากนั้นใช้เครื่องคำนวณภาคสนามเพื่อคำนวณค่าใหม่ด้วยนิพจน์ Python !MY_FIELD![:-1]- ส่วนของสตริงควรลบอักขระบรรทัดใหม่ (สมมติว่าไม่มีอะไรเกิดขึ้นหลังจากขึ้นบรรทัดใหม่ซึ่งน่าจะเป็นกรณีของ OP) .
nmpeterson

3

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

เครื่องคิดเลขฟิลด์เป็นบิตสับสนเมื่อมันมาถึงลำดับหนีเหมือนและ\n \tเพียงใช้รหัสอักขระดิบ


ยังคงได้รับSyntaxError: EOL while scanning string literalกับสิ่งนี้ ตัวแยกวิเคราะห์ VB ทำงานได้ดี
blah238

ในการแสดงออกและไม่บล็อกรหัส? และเฉพาะวันที่ 10.0?
Jason Scheirer

ในนิพจน์บน 10.1 SP1
blah238

2
myString = "My text\n"

print myString.strip()

ที่ไม่ได้ทำงานในเครื่องคิดเลข
artwork21

คุณต้องการโซลูชัน Python หรือโซลูชัน VBA (ArcGIS 9) หรือไม่? แถบ (), rstrip () และ lstrip () จัดการเฉพาะกับตัวละครที่ปลาย หากอยู่กลางสตริงให้ลองแทนที่. ("\ n", "")
Dan

ใช่ฉันต้องการโซลูชันงูหลามในเครื่องคำนวณภาคสนาม การส่งคืนจะอยู่ภายในสตริงไม่ใช่ตอนท้าย ฉันลอง. แทนที่ ("\ n", "") อย่างไรก็ตามฉันได้รับข้อผิดพลาดทั่วไป 000539
artwork21

ข้อผิดพลาด Python ที่ระบุเฉพาะกับหมายเลขนี้คืออะไร
Dan

โพสต์ข้อความผิดพลาดในคำถามของฉัน
Artwork21

2

ฉันคิดว่าสิ่งนี้ควรทำงานเป็นรหัสสคริปต์พื้นฐานในฟิลด์เครื่องคิดเลข - แต่น่าเสียดายที่มันไม่ควรทำ ฉันได้โพสต์ไว้แล้วในกรณีที่ให้แนวทางอื่นที่คุณสามารถปรับแต่งเพื่อให้ทำงานได้

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

2

ลองห่อของคุณ!field!ประกาศในการแสดงออกด้วยคำพูดและสตริงดิบ initializer r"!field!"เช่น

ลองstr(!field!)เช่นกัน


มันไม่ทำงาน ฉันยังลองMYFIELD.replace(r"\n",""), but it doesn't see that I've escaped the newline character, it just fails with a ผิดพลาด EOL
ซินดี้ Jayakumar

คุณถูกต้องแล้วดูคำตอบอื่นของฉัน ออกจากสิ่งนี้เพื่อลูกหลาน
blah238
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.