Pythonとフィールド計算機を使用して、フィールドからリターン/改行(\ n)文字を削除しますか?


14

リターン文字(改行)を削除しようとしているフィールドを持つジオデータベーステーブルがあります。その投稿方法(Pythonで改行を削除(削除)する方法はありますか?)を見つけましたが、フィールド計算機では機能しません。私が試したコードスニペットを以下に 示します文字列の末尾にリターン文字がないことに注意してください

!myField!.rstrip()

または

!myField!.rstrip('\n')

または

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

または

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

このオプションに指定された000539エラー:

説明フィールドの計算ツールまたは値の計算ツールで使用される計算が無効です。提供されるこのエラーメッセージには、特定のPythonエラーがリストされます。

ソリューションこのエラーコードは、多くのPythonエラーをカバーしています。

エラー例1:exceptions.TypeError: 'str'および 'int'オブジェクトを連結できません。上記はPython固有のエラーです。計算は、文字列と数値を追加または連結しようとしています。

エラー例2:無効なフィールドshape @ distance上記は、geometryオブジェクトを使用したエラーです。距離メソッドは、ジオメトリオブジェクトの有効なメソッドではありません。

特定のPythonの問題については、外部のPythonヘルプで詳細を参照するか、フィールドの計算または値の計算ヘルプでこれらのツールの詳細を参照してください。

または

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

フィールド計算機を使用して戻り文字を削除する方法のアイデアはありますか?


改行文字( "\ n")ですか?代わりにキャリッジリターン( "\ r")である可能性がありますか?また、すべての行のすべての値はアルファですか、それともフィールドのいずれかの数値で失敗していますか?おそらくstr(!myField!)。rstrip( '\ n')
RyanKDalton

取得しているArcGISエラー(一般的で役に立たない)ではなく、エラーメッセージと行番号を含む完全なPythonトレースバックを投稿してください。
blah238

さまざまなPythonの回答がすべて正しいため、ArcGIS自体のように見え始めています。
シンディジャヤクマル

SyntaxError: EOL while scanning string literalエラーが発生していますか?
blah238

計算機がモジュールのインポートをどのように処理するかはわかりませんが、次のことも試してください:import reとre.subを使用します。
トメック

回答:


9

これは、フィールド計算機/フィールド計算ツールを使用したPythonパーサーのバグ/制限にすぎないと思います。テキストフィールド内で改行が検出されると、SyntaxError: EOL while scanning string literal何を試みてもa が発生します。

10.1 SP1では、次のCSVファイルをファイルジオデータベースにインポートし、フィールドを追加しTextて、フィールドカリキュレーターとPythonパーサーおよびand式を使用してフィールドを新しいフィールドにコピーするだけで、問題を再現できます!Text!

ID、テキスト
1、「これは複数行です 
例」

VBパーサーに切り替えるか、またはUpdateCursorフィールドカルキュレーターを完全に使用しないようにしてください。

この問題は、ESRIフォーラムでも議論されており、同じ結論が得られています。

私が見つけることができた唯一の関連するNIMはこれでした:

  • NIM085499-非ASCII文字を使用したCalculateFieldの計算は、Linuxエンジンで「ERROR 000539:SyntaxError:EOL while scaning string literal(、line 1)」で失敗します。

4

信頼できるとわかった解決策は2つあります。何らかの理由で、CartoPacでは、人々が私が働いているREMARKSフィールドにReturnを入れることができます。それらを取り除くために、私が最もうまくいくことがわかった解決策は、フィールド計算機を使用することです。

パーサーをPythonに変更します。事前論理スクリプトコードに以下を入力します。

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

次を次のテキストボックスに入力します(これはREMARKSというフィールドで作業しています)。

carriageReturnRemoval( !REMARKS! )

ここに画像の説明を入力してください

キャリッジリターンが削除されると、スペース、-、および各行の間にスペースが追加されます。必要に応じて、「-」を別の文字または文字セットに変更できます。しかし、建設作業員がデータを入力する方法に基づいて、これが私にとって最適に機能することがわかりました。各キャリッジリターンを分割する認識可能な文字パターンがある場合、新しい属性を示すためにフィールドで使用する場合、検索/置換操作を実行する方が簡単ですそもそも頭痛の種を救ってくれました)。

ArcGISでPythonコンソールを使用する場合は、上記を変更して機能するようにできます。しかし、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)  

「Assets \ Welds」を適切なfc名に置き換え、row.REMARKSをrowに置き換えます(ここにフィールド名を挿入します)

上記のコード例を試す前に、以下のインポート行を実行する必要がある場合としない場合があります。

import arcpy  
import string

ifステートメントをインデントする必要がある後のステートメントを試してみます。
アートワーク

良いキャッチ...作業中のPythonコマンドウィンドウスクリプトからコピーしたときに適切にコピーしませんでした。
ザカリーオルド-GISP 14

4

私のフィーチャクラステーブルはExcelで作成されているため、この問題を回避するには、次のExcelコマンドを使用します。

= クリーン

すべての改行文字または改行文字を削除するメソッド。その後、テーブルを結合したり、GISデータベースにインポートしたりできます。


3

SQLステートメントを使用して、最初に改行文字を選択しました。でSelect By Attributesダイアログウィンドウ:

"MY_FIELD" LIKE '%
 %'

Enter最初の%の後に押す必要があります。


2
改行文字がどこにあるのかを示したが、仕事もできなかったが、MY_FIELD.strip()レコードが5つしかなかったため、手動で編集したことに気付いた。
シンディジャヤクマル

おそらくこのように選択し、フィールド計算機を使用してPython式で値を再計算することができます!MY_FIELD![:-1]-文字列スライスは改行文字を削除する必要があります(OPの場合は改行の後に何も来ないと仮定します) 。
nmpeterson 14

3

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

フィールド計算機は、\nやなどのエスケープシーケンスに関しては少し混乱しています\t。生の文字コードを使用するだけです。


まだこれで取得しSyntaxError: EOL while scanning string literalています。VBパーサーは正常に動作します。
blah238

コードブロックではなく式で?そして、10.0でのみ?
ジェイソンシャイラー

式では、10.1 SP1。
blah238

2
myString = "My text\n"

print myString.strip()

フィールド計算機では機能しませんでした。
アートワーク21

PythonソリューションまたはVBA(ArcGIS 9)ソリューションが必要ですか?strip()、rstrip()、およびlstrip()は、両端の文字のみを処理します。文字列の途中にある場合は、.replace( "\ n"、 "")を試してください
Dan

はい、フィールド計算機内でpythonソリューションが必要です。戻り値は、末尾ではなく文字列内にあります。.replace( "\ n"、 "")を試しましたが、一般的な000539エラーが発生しました。
アートワーク

この番号で与えられる特定のPythonエラーは何ですか?
ダン

私の質問にエラーメッセージを投稿しました。
アートワーク21

2

これは、フィールド計算機の事前ロジックスクリプトコードとして機能するはずですが、残念ながら機能しないようです。とにかく、それがあなたが仕事をするために微調整することができる代わりのアプローチをあなたに提供するならば、私はそれを投稿しました。

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

2

!field!式内の宣言を引用符と生の文字列初期化子などでラップしてみてください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エラーも試しました。
シンディジャヤクマル

あなたは正しいです、他の答えを見てください。これを後世に残します。
blah238
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.