Menghapus karakter return / newline (\ n) dari Field menggunakan Python dan Field Calculator?

14

Saya memiliki tabel geodatabase dengan bidang yang saya coba hapus kembali karakter (baris baru). Saya menemukan posting ini ( Bagaimana saya bisa menghapus (chomp) baris baru dengan Python? ) Tentang bagaimana melakukannya, namun tidak berfungsi dalam kalkulator lapangan. Berikut ini cuplikan kode yang saya coba: Catatan karakter kembali bukan di akhir string .

!myField!.rstrip()

ATAU

!myField!.rstrip('\n')

ATAU

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

ATAU

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

000539 kesalahan yang diberikan untuk opsi ini:

Deskripsi Perhitungan yang digunakan oleh bidang Hitung atau alat Nilai Hitung tidak valid. Pesan kesalahan ini disediakan akan mencantumkan kesalahan Python spesifik.

Solusi Kode kesalahan ini mencakup sejumlah kesalahan Python:

Contoh kesalahan 1: exception.TypeError: tidak dapat menggabungkan objek 'str' dan 'int'. Di atas adalah kesalahan khusus Python. Perhitungan sedang mencoba untuk menambah atau menggabungkan string dan angka.

Contoh kesalahan 2: Bentuk bidang tidak valid @ jarak Di atas adalah kesalahan menggunakan objek geometri. Metode jarak bukanlah metode yang valid dari objek geometri.

Untuk masalah Python tertentu, bacalah bantuan Python eksternal untuk informasi lebih lanjut, atau bacalah bidang Hitung atau bantuan Nilai Hitung untuk informasi lebih lanjut tentang alat-alat ini.

ATAU

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

Adakah gagasan tentang cara menghapus karakter kembali menggunakan kalkulator bidang?

artwork21
sumber
Apakah Anda yakin itu karakter baris baru ("\ n")? Mungkinkah itu carriage return ("\ r")? Juga, apakah semua nilai di semua baris alpha, atau mungkin gagal pada nilai numerik di salah satu bidang? Kemungkinan str (! MyField!). Rstrip ('\ n')
RyanKDalton
Silakan kirim traceback Python lengkap dengan pesan kesalahan dan nomor baris, bukan kesalahan ArcGIS yang Anda dapatkan (yang umum dan tidak membantu).
blah238
Itu mulai terlihat seperti sesuatu di ArcGIS itu sendiri, karena berbagai jawaban Python yang diberikan semuanya benar.
Cindy Jayakumar
Apakah Anda mendapatkan SyntaxError: EOL while scanning string literalkesalahan?
blah238
Saya tidak yakin bagaimana kalkulator menangani modul impor, tetapi Anda juga dapat mencoba: import re dan gunakan re.sub.
Tomek

Jawaban:

9

Saya pikir ini hanyalah bug / batasan parser Python dengan kalkulator bidang / alat Hitung Bidang. Jika baris baru ditemukan dalam bidang teks, a SyntaxError: EOL while scanning string literalterjadi apa pun yang Anda coba.

Saya bisa mereproduksi masalah di 10.1 SP1 dengan mengimpor file CSV berikut ke dalam file geodatabase, menambahkan bidang dan hanya mencoba untuk menyalin Textbidang ke bidang baru menggunakan Kalkulator Bidang dengan parser Python dan dan ekspresi !Text!.

ID, Teks
1, "ini adalah multiline 
contoh"

Coba beralih ke parser VB, atau gunakan UpdateCursordan hindari Kalkulator Bidang sepenuhnya.

Masalah ini juga dibahas di forum ESRI, dengan kesimpulan yang sama:

Satu-satunya NIM relevan yang dapat saya temukan adalah ini:

  • NIM085499 - Perhitungan CalculateField menggunakan karakter non-ASCII gagal pada mesin Linux dengan: "ERROR 000539: SyntaxError: EOL saat memindai string literal (, baris 1)".
blah238
sumber
4

Ada dua kemungkinan solusi yang menurut saya dapat diandalkan. Untuk beberapa alasan, CartoPac memungkinkan orang-orang untuk melakukan Pengembalian di bidang REMARKS tempat saya bekerja. Untuk menghilangkannya, solusi yang menurut saya paling berhasil adalah menggunakan Field Calculator.

Ubah Parser Anda menjadi Python. Masukkan yang berikut ini dalam Kode Naskah Pra-Logika:

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

Masukkan yang berikut ini di kotak teks berikutnya (yang ini bekerja pada bidang yang disebut REMARKS):

carriageReturnRemoval( !REMARKS! )

masukkan deskripsi gambar di sini

Ketika kereta Anda kembali dihapus, itu akan menambah ruang, -, dan ruang di antara setiap baris. Anda dapat memodifikasi "-" menjadi karakter atau rangkaian karakter yang berbeda jika diinginkan. Tapi saya menemukan ini bekerja paling baik untuk saya berdasarkan cara kru konstruksi saya memasukkan data. Lebih mudah untuk melakukan operasi Find / Replace jika ada pola karakter yang dapat dikenali yang memecah setiap carriage return, yang mereka gunakan di lapangan untuk menunjukkan atribut baru (meskipun seringkali merupakan atribut yang mereka bisa saja taruh di bidang yang tepat dan menyelamatkan saya sakit kepala di tempat pertama).

Jika Anda lebih suka menggunakan Konsol Python di ArcGIS, Anda dapat memodifikasi di atas agar berfungsi. Namun saya juga sudah mencoba ini dengan beberapa keberhasilan di 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)  

Ganti "Aset \ Lasan" dengan nama fc yang sesuai dan ganti baris. PERBAIKAN dengan baris. (Masukkan nama bidang di sini)

Anda mungkin atau mungkin tidak perlu menjalankan jalur impor di bawah sebelum mencoba contoh kode di atas:

import arcpy  
import string
Zachary Ordo - GISP
sumber
Saya mencobanya, pernyataan Anda setelah pernyataan jika perlu indentasi.
artwork21
Bagus menangkap ... itu tidak menyalin dengan benar ketika saya menyalin dari skrip jendela perintah Python bekerja.
Zachary Ordo - GISP
4

Pekerjaan untuk ini karena tabel kelas fitur saya berasal dari excel adalah dengan menggunakan perintah excel berikut:

= BERSIH

metode untuk menghapus semua karakter baris kembali atau baru. Anda kemudian dapat bergabung atau mengimpor tabel ke dalam database GIS Anda.

artwork21
sumber
3

Saya telah menggunakan pernyataan SQL untuk memilih karakter baris pertama. Di Select By Attributesjendela dialog:

"MY_FIELD" LIKE '%
 %'

Anda harus menekan Entersetelah% pertama.

Cindy Jayakumar
sumber
2
Saya baru menyadari bahwa walaupun ini menunjukkan kepada saya di mana karakter baris baru berada, saya juga tidak dapat mulai MY_FIELD.strip()bekerja, tetapi karena saya hanya memiliki 5 catatan, saya mengeditnya secara manual.
Cindy Jayakumar
Anda mungkin dapat memilihnya seperti ini dan kemudian menggunakan kalkulator bidang untuk menghitung ulang nilai-nilai dengan ekspresi Python !MY_FIELD![:-1]- irisan string harus menghapus karakter baris baru (dengan asumsi tidak ada yang muncul setelah baris baru, yang tampaknya menjadi kasus OP) .
nmpeterson
3

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

Kalkulator lapangan agak bingung ketika harus keluar dari urutan seperti \ndan \t. Cukup gunakan kode karakter mentah.

Jason Scheirer
sumber
Masih bergaul SyntaxError: EOL while scanning string literaldengan ini. VB parser berfungsi dengan baik.
blah238
Dalam ekspresi dan bukan blok kode? Dan hanya pada 10.0?
Jason Scheirer
Dalam ungkapan, pada 10.1 SP1.
blah238
2
myString = "My text\n"

print myString.strip()
Dan
sumber
yang tidak berfungsi di bidang kalkulator.
artwork21
Apakah Anda memerlukan solusi Python atau solusi VBA (ArcGIS 9)? strip (), rstrip () dan lstrip () hanya berurusan dengan karakter di ujungnya. Jika berada di tengah-tengah string, coba .replace ("\ n", "")
Dan
Ya, saya memerlukan solusi python dalam kalkulator bidang. Pengembalian berada dalam string bukan di akhir. Saya mencoba .replace ("\ n", ""), namun saya mendapatkan kesalahan 000539 umum.
artwork21
Apa kesalahan Python spesifik yang diberikan dengan nomor ini?
Dan
Diposting pesan kesalahan dalam pertanyaan saya.
artwork21
2

Saya pikir ini harus berfungsi sebagai Kode Skrip Pra-logika di Kalkulator Bidang - tetapi sayangnya sepertinya tidak. Saya tetap mempostingnya kalau-kalau itu memberi Anda pendekatan alternatif yang dapat Anda tweak untuk bekerja.

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

Coba bungkus !field!pernyataan Anda dalam ekspresi dengan tanda kutip dan initializer string mentah , mis r"!field!".

Coba str(!field!)juga.

blah238
sumber
Itu tidak bekerja. Saya juga mencoba MYFIELD.replace(r"\n",""), but it doesn't see that I've escaped the newline character, it just fails with a kesalahan EOL`.
Cindy Jayakumar
Anda benar, lihat jawaban saya yang lain. Meninggalkan yang satu ini untuk anak cucu.
blah238