การลบอักขระ 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.