Dönüş / yeni satır (\ n) karakteri Python ve Alan Hesaplayıcı'yı kullanarak Alan'dan kaldırılsın mı?


14

Dönüş karakterlerini (yeni satır) kaldırmaya çalıştığım bir alana sahip bir coğrafi veritabanı tablosu var. Bunu nasıl yapacağımı bu yazı ( Python'da bir satırsonu nasıl kaldırabilirim (chomp)? ), Ancak alan hesap makinesi içinde çalışmıyor. İşte ben denedim kod parçacıkları: Not dönüş karakteri dizenin sonunda değil .

!myField!.rstrip()

VEYA

!myField!.rstrip('\n')

VEYA

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

VEYA

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

Bu seçenek için 000539 hatası verildi:

Açıklama Alan Hesapla veya Değer Hesapla aracı tarafından kullanılan hesaplama geçersiz. Sağlanan bu hata mesajı belirli Python hatasını listeleyecektir.

Çözüm Bu hata kodu bir dizi Python hatasını kapsar:

Örnek hata 1: istisnalar.TypeError: 'str' ve 'int' nesnelerini birleştiremez. Yukarıdaki Python'a özgü bir hatadır. Hesaplama bir dize ve bir sayı eklemeye veya birleştirmeye çalışıyor.

Örnek hata 2: Geçersiz alan şekli @ mesafe Yukarıdaki geometri nesnesini kullanan bir hatadır. Distance yöntemi, geometri nesnesinin geçerli bir yöntemi değildir.

Belirli Python sorunları için daha fazla bilgi için harici Python yardımına veya bu araçlar hakkında daha fazla bilgi için Alanı Hesapla veya Değeri Hesapla yardımına başvurun.

VEYA

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

Herhangi bir fikir alan hesap makinesi kullanarak dönüş karakterleri kaldırmak için herhangi bir fikir?


Yeni satır karakteri olduğundan emin misiniz ("\ n")? Bunun yerine bir satırbaşı ("\ r") olabilir mi? Ayrıca, tüm satırlardaki tüm değerler alfa mı yoksa alanlardan birinde sayısal bir değer üzerinde mi başarısız olabilir? Muhtemelen str (! MyField!). Rstrip ('\ n')
RyanKDalton

Lütfen aldığınız ArcGIS hatasını değil (genel ve yararsızdır) hata mesajının ve satır numarasının tam Python izlemesini gönderin.
blah238

ArcGIS'in kendisinde bir şeye benzemeye başlıyor, çünkü verilen çeşitli Python cevaplarının hepsi doğru.
Cindy Jayakumar

SyntaxError: EOL while scanning string literalHata mı alıyorsunuz ?
blah238

Hesap makinesinin içe aktarma modüllerini nasıl ele aldığından emin değilim, ancak şunu da deneyebilirsiniz: import re ve re.sub kullanın.
Tomek

Yanıtlar:


9

Bu sadece bir hata / alan hesap makinesi / Hesapla alan aracı ile Python ayrıştırıcı bir sınırlama olduğunu düşünüyorum. Metin alanında bir satırsonu ile karşılaşılırsa, SyntaxError: EOL while scanning string literalne denerseniz deneyin bir oluşur.

Aşağıdaki CSV dosyasını bir dosya coğrafi veritabanına aktararak, bir alan ekleyerek ve yalnızca TextPython ayrıştırıcısı ve ifadesi ile Alan Hesaplayıcısı'nı kullanarak alanı yeni alana kopyalamaya çalışarak sorunu 10.1 SP1'de yeniden oluşturabilirim !Text!.

Kimlik, Metin
1, "bu çok satırlı 
misal"

VB ayrıştırıcısına geçmeyi veya UpdateCursorAlan Hesaplayıcıdan tamamen kaçınmayı ve kullanmayı önlemeyi deneyin .

Bu konu aynı sonuçlarla birlikte ESRI forumlarında da tartışılmaktadır:

Bulabildiğim tek alakalı NIM şuydu:

  • NIM085499 - ASCII olmayan karakterler kullanan CalculateField hesaplamaları şu Linux dizisinde başarısız olur: "ERROR 000539: SyntaxError: Dize değişmezini (, satır 1) tararken EOL".

4

Güvenilir bulduğum iki olası çözüm var. Nedense CartoPac insanların çalıştığım REMARKS alanına bir İade koymalarına izin verir. Bunlardan kurtulmak için en iyi sonucu bulduğum çözüm Saha Hesaplayıcı'yı kullanmaktır.

Ayrıştırıcınızı Python olarak değiştirin. Mantık Öncesi Komut Dosyası Koduna aşağıdakileri koyun:

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

Aşağıdaki metni bir sonraki metin kutusuna koyun (bu, REMARKS adlı bir alanda çalışıyor):

carriageReturnRemoval( !REMARKS! )

resim açıklamasını buraya girin

Taşıyıcınız geri döndüğünde, her satır arasına bir boşluk, - ve bir boşluk ekler. İsterseniz "-" karakterini farklı bir karakterde veya karakter kümesinde değiştirebilirsiniz. Ancak inşaat ekiplerimin veri girme şekline göre bunun benim için en iyi sonucu verdiğini gördüm. Her bir satır başını ayıran ve yeni bir niteliği belirtmek için alanda kullandıkları tanınabilir karakter desenleri varsa (genellikle uygun alana koyabilecekleri bir özellik olsa da) Bul / Değiştir işlemleri yapmak daha kolaydır ve başta baş ağrımı kurtardı).

ArcGIS'de Python Konsolu'nu kullanmayı tercih ederseniz, yukarıdakileri çalışmak için değiştirebilirsiniz. Ancak ben de bunu Python Konsolunda bazı başarı ile denedim:

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" yerine uygun fc adını yazın ve row.REMARKS öğesini row ile değiştirin. (Alan adını buraya ekleyin)

Yukarıdaki kod örneğini denemeden önce aşağıdaki içe aktarma satırlarını çalıştırmanız gerekebilir veya gerekmeyebilir:

import arcpy  
import string

Ben denemek, if deyim girintili sonra ifade.
artwork21

İyi yakalama ... Ben çalışan Python komut penceresi komut dosyasından kopyaladığımda düzgün kopyalamadı.
Zachary Ordo - GISP

4

Özellik sınıfı tablo excel kökenli beri bu geçici çözüm için aşağıdaki excel komutunu kullanmak oldu:

= TEMİZ

tüm döndürme veya yeni satır karakterlerini kaldırma yöntemi. Daha sonra tabloyu birleştirebilir veya CBS veritabanınıza aktarabilirsiniz.


3

İlk önce yeni satır karakterlerini seçmek için bir SQL deyimi kullandım. Gelen Select By Attributesiletişim penceresinde:

"MY_FIELD" LIKE '%
 %'

Enterİlk% 'den sonra basmanız gerekir .


2
Bu yeni satır karakterlerinin nerede olduğunu gösterirken, MY_FIELD.strip()işe bile gidemediğimi fark ettim , ancak sadece 5 kaydım olduğu için bunları manuel olarak düzenledim.
Cindy Jayakumar

Muhtemelen bunları böyle seçebilir ve daha sonra Python ifadesi ile değerleri yeniden hesaplamak için alan hesaplayıcısını kullanabilirsiniz !MY_FIELD![:-1]- dize dilimi satırsonu karakterini kaldırmalıdır (satır satırından sonra hiçbir şey gelmediğini varsayarak, OP için durum böyle görünüyor) .
nmpeterson

3

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

Alan hesap makinesi \nve gibi dizileri kaçmak söz konusu olduğunda biraz karışık \t. Sadece ham karakter kodlarını kullanın.


Hala SyntaxError: EOL while scanning string literalbununla bir elde . VB ayrıştırıcı iyi çalışıyor.
blah238

Kod bloğunda değil ifadede? Ve sadece 10.0'da mı?
Jason Scheirer

İfadede, 10.1 SP1'de.
blah238

2
myString = "My text\n"

print myString.strip()

alan hesap makinesinde çalışmadı.
artwork21

Bir Python çözümüne veya bir VBA (ArcGIS 9) çözümüne mi ihtiyacınız var? strip (), rstrip () ve lstrip () sadece uçlardaki karakterlerle ilgilenir. Bir dizenin ortasındaysa, .replace ("\ n", "") deneyin
Dan

Evet, alan hesap makinesinde bir python çözümüne ihtiyacım var. Dönüş, sonunda olmayan dizenin içindedir. .Replace ("\ n", "") denedim, ancak genel bir 000539 hatası aldım.
Resim21

Bu numarayla verilen belirli Python hatası nedir?
Dan

Soruma gönderilen hata mesajı.
Resim21

2

Bu Alan Hesap Makinesi ön-mantık Script Kodu olarak çalışması gerektiğini düşünüyorum - ama ne yazık ki öyle görünmüyor. Eğer işe almak için tweak yapabilirsiniz alternatif bir yaklaşım verirse yine de yayınladım.

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

2

İfadenize !field!tırnak işaretleri ve bir ham dize başlatıcısı (ör r"!field!".

Siz str(!field!)de deneyin .


Çalışmıyor. Ayrıca MYFIELD.replace(r"\n",""), but it doesn't see that I've escaped the newline character, it just fails with a EOL` hatasını denedim .
Cindy Jayakumar

Haklısın, diğer cevabımı gör. Bunu gelecek nesiller için bırakmak.
blah238
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.