Xóa ký tự return / newline (\ n) khỏi Trường bằng Python và Máy tính trường?


14

Tôi có một bảng cơ sở dữ liệu địa lý với một trường mà tôi đang cố xóa các ký tự trả về (dòng mới). Tôi đã tìm thấy bài đăng này ( Làm cách nào tôi có thể xóa (chomp) một dòng mới trong Python? ) Về cách thực hiện, tuy nhiên nó không hoạt động trong máy tính trường. Dưới đây là đoạn mã mà tôi đã thử: Ký tự trả về không nằm ở cuối chuỗi .

!myField!.rstrip()

HOẶC LÀ

!myField!.rstrip('\n')

HOẶC LÀ

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

HOẶC LÀ

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

Lỗi 000539 cho tùy chọn này:

Mô tả Tính toán được sử dụng bởi công cụ Tính toán trường hoặc Tính toán giá trị không hợp lệ. Thông báo lỗi được cung cấp sẽ liệt kê lỗi Python cụ thể.

Giải pháp Mã lỗi này bao gồm một số lỗi Python:

Ví dụ lỗi 1: ngoại lệ.TypeError: không thể ghép các đối tượng 'str' và 'int'. Trên đây là một lỗi cụ thể của Python. Tính toán đang cố gắng thêm hoặc nối một chuỗi và một số.

Ví dụ lỗi 2: Hình dạng trường không hợp lệ @ distance Trên đây là lỗi sử dụng đối tượng hình học. Phương thức khoảng cách không phải là một phương thức hợp lệ của đối tượng hình học.

Đối với các sự cố Python cụ thể, hãy tham khảo trợ giúp Python bên ngoài để biết thêm thông tin hoặc tham khảo trợ giúp Trường tính toán hoặc Tính toán giá trị để biết thêm thông tin về các công cụ này.

HOẶC LÀ

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

Bất kỳ ý tưởng làm thế nào để loại bỏ các ký tự trở lại bằng cách sử dụng máy tính trường?


Bạn có chắc chắn đó là một ký tự dòng mới ("\ n")? Thay vào đó, nó có thể là một sự trở lại vận chuyển ("\ r") không? Ngoài ra, có phải tất cả các giá trị trong tất cả các hàng alpha hoặc có thể không thành công trên một giá trị số trong một trong các trường không? Có thể str (! MyField!). Rstrip ('\ n')
RyanKDalton-OffTheGridMaps

Vui lòng gửi toàn bộ truy nguyên Python với thông báo lỗi và số dòng, không phải lỗi ArcGIS mà bạn đang gặp phải (đó là chung chung và không có ích).
blah238

Nó bắt đầu giống như một cái gì đó trong chính ArcGIS, bởi vì các câu trả lời Python khác nhau được đưa ra đều đúng.
Cindy Jayakumar

Bạn đang nhận được một SyntaxError: EOL while scanning string literallỗi?
blah238

Tôi không chắc máy tính xử lý các mô-đun nhập như thế nào, nhưng bạn cũng có thể thử: nhập re và sử dụng re.sub.
Tomek

Câu trả lời:


9

Tôi nghĩ rằng đây chỉ là một lỗi / giới hạn của trình phân tích cú pháp Python với công cụ tính toán trường / Công cụ tính toán trường. Nếu một dòng mới gặp phải trong trường văn bản, sẽ SyntaxError: EOL while scanning string literalxảy ra bất kể bạn cố gắng gì.

Tôi có thể tái tạo sự cố tại 10.1 SP1 bằng cách nhập tệp CSV sau vào cơ sở dữ liệu địa lý tệp, thêm trường và chỉ cần cố gắng sao chép Texttrường sang trường mới bằng Máy tính trường với trình phân tích cú pháp Python và biểu thức !Text!.

ID, văn bản
1, "đây là một multiline 
thí dụ"

Hãy thử chuyển sang trình phân tích cú pháp VB hoặc sử dụng UpdateCursorvà tránh hoàn toàn Máy tính trường.

Vấn đề này cũng được thảo luận trên các diễn đàn ESRI, với cùng kết luận:

NIM duy nhất có liên quan tôi có thể tìm thấy là:

  • NIM085499 - Tính toán Tính toán năng suất bằng cách sử dụng các ký tự không phải ASCII không thành công trên công cụ Linux với: "ERROR 000539: SyntaxError: EOL trong khi quét chuỗi ký tự (dòng 1)".

4

Có hai giải pháp khả thi mà tôi thấy là đáng tin cậy. Vì một số lý do, CartoPac cho phép mọi người đặt Return trong trường REMARKS nơi tôi làm việc. Để loại bỏ những thứ đó, giải pháp mà tôi thấy hiệu quả nhất là sử dụng Máy tính Trường.

Thay đổi Parser của bạn thành Python. Đặt phần sau vào Mã script Pre-Logic:

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

Đặt phần sau vào hộp văn bản tiếp theo (cái này đang hoạt động trên một trường có tên là REMARKS):

carriageReturnRemoval( !REMARKS! )

nhập mô tả hình ảnh ở đây

Khi trả lại vận chuyển của bạn bị xóa, nó sẽ thêm một khoảng trắng, - và một khoảng trắng giữa mỗi dòng. Bạn có thể sửa đổi "-" thành một ký tự hoặc bộ ký tự khác nếu bạn muốn. Nhưng tôi đã thấy điều này hoạt động tốt nhất với tôi dựa trên cách các đội xây dựng của tôi nhập dữ liệu. Các thao tác Tìm / Thay thế sẽ dễ dàng hơn nếu có các mẫu ký tự dễ nhận biết khi chia nhỏ mỗi lần trả về vận chuyển, chúng sử dụng trong trường để biểu thị một thuộc tính mới (mặc dù đó thường là một thuộc tính mà chúng có thể đặt vào trường thích hợp và cứu tôi đau đầu ngay từ đầu).

Nếu bạn muốn sử dụng Bảng điều khiển Python trong ArcGIS, bạn có thể sửa đổi phần trên để hoạt động. Tuy nhiên, tôi cũng đã thử điều này với một số thành công trong Bảng điều khiển 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)  

Thay thế "Tài sản \ Mối hàn" bằng tên fc thích hợp và thay thế hàng.REWORS bằng hàng. (Nhập tên trường vào đây)

Bạn có thể hoặc không cần chạy các dòng nhập bên dưới trước khi thử ví dụ mã ở trên:

import arcpy  
import string

Tôi cho nó một shot, tuyên bố của bạn sau khi câu lệnh if của bạn cần thụt lề.
nghệ thuật21

Bắt tốt ... nó đã không sao chép đúng khi tôi sao chép từ tập lệnh cửa sổ lệnh Python đang hoạt động.
Zachary Ordo - GISP

4

Công việc xoay quanh việc này vì bảng lớp tính năng của tôi bắt nguồn từ excel là sử dụng lệnh excel sau:

= SẠCH

phương pháp để loại bỏ tất cả các ký tự dòng trở lại hoặc mới. Sau đó, bạn có thể tham gia hoặc nhập bảng vào cơ sở dữ liệu GIS của mình.


3

Trước tiên tôi đã sử dụng câu lệnh SQL để chọn các ký tự dòng mới. Trong Select By Attributescửa sổ hộp thoại:

"MY_FIELD" LIKE '%
 %'

Bạn phải nhấn Entersau% đầu tiên.


2
Tôi chỉ nhận ra rằng trong khi điều này cho tôi thấy các ký tự dòng mới ở đâu, tôi cũng không thể MY_FIELD.strip()làm việc, nhưng vì tôi chỉ có 5 bản ghi, tôi đã tự chỉnh sửa chúng.
Cindy Jayakumar

Bạn có thể chọn chúng như thế này và sau đó sử dụng máy tính trường để tính lại các giá trị bằng biểu thức Python !MY_FIELD![:-1]- lát cắt chuỗi sẽ loại bỏ ký tự dòng mới (giả sử không có gì xuất hiện sau dòng mới, dường như là trường hợp của OP) .
nmpeterson

3

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

Máy tính trường là một chút bối rối khi nói đến thoát khỏi trình tự như \n\t. Chỉ cần sử dụng mã ký tự thô.


Vẫn nhận được một SyntaxError: EOL while scanning string literalvới điều này. Trình phân tích cú pháp VB hoạt động tốt.
blah238

Trong biểu thức và không phải khối mã? Và chỉ trên 10.0?
Jason Scheirer

Trong biểu thức, trên 10.1 SP1.
blah238

2
myString = "My text\n"

print myString.strip()

mà không làm việc trong máy tính trường.
nghệ thuật21

Bạn có cần một giải pháp Python hoặc giải pháp VBA (ArcGIS 9) không? dải (), rstrip () và lstrip () chỉ xử lý các ký tự ở cuối. Nếu nó ở giữa một chuỗi, hãy thử .replace ("\ n", "")
Dan

Có, tôi cần một giải pháp python trong máy tính trường. Sự trở lại là trong chuỗi không ở cuối. Tôi đã thử .replace ("\ n", ""), tuy nhiên tôi gặp lỗi chung 000539.
nghệ thuật21

Lỗi Python cụ thể được đưa ra với số này là gì?
Dan

Gửi thông báo lỗi trong câu hỏi của tôi.
nghệ thuật21

2

Tôi nghĩ rằng điều này sẽ hoạt động như Mã script tiền logic trong Máy tính trường - nhưng thật không may là nó dường như không. Tôi đã đăng nó bằng mọi cách trong trường hợp nó cung cấp cho bạn một cách tiếp cận khác mà bạn có thể điều chỉnh để làm việc.

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

2

Hãy thử gói !field!khai báo của bạn trong biểu thức bằng dấu ngoặc kép và trình khởi tạo chuỗi thô , vd r"!field!".

Cố gắng str(!field!)là tốt.


Nó không hoạt động. Tôi cũng đã thử MYFIELD.replace(r"\n",""), but it doesn't see that I've escaped the newline character, it just fails with a lỗi EOL`.
Cindy Jayakumar

Bạn đã đúng, xem câu trả lời khác của tôi. Để lại cái này cho hậu thế.
blah238
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.