1

キャレット区切りのファイルがあります。ファイル内の唯一のキャレットは区切り記号です。テキストにはありません。一部のフィールドはフリー テキスト フィールドで、改行文字が埋め込まれています。これにより、ファイルの解析が非常に困難になります。レコードの末尾に改行文字が必要ですが、テキストを含むフィールドから改行文字を削除する必要があります。

これは、 Global Integrated Shipping Information Systemからのオープン ソースの海洋海賊行為データです。以下に、ヘッダー行が先行する 3 つのレコードを示します。1つ目はNORMANNIA、2つ目は「Unkown」、3つ目はKOTA BINTANGです。

ship_name^ship_flag^tonnage^date^time^imo_num^ship_type^ship_released_on^time_zone^incident_position^coastal_state^area^lat^lon^incident_details^crew_ship_cargo_conseq^incident_location^ship_status_when_attacked^num_involved_in_attack^crew_conseq^weapons_used_by_w_attackers^ship_parts_looundingcre^live^乗組員の人質誘拐^暴行^身代金^master_crew_action_taken^reported_to_coastal_authority^reported_to_which_coastal_authority^reporting_state^reporting_intl_org^coastal_state_action_taken
NORMANNIA^リベリア^24987^2009-09-19^22:30^9142980^ばら積み貨物船^^^プラウ・マンカイ沖、^^南シナ海^3° 04.00' N^105° 16.00' E^8 人の海賊ナイフとバールが進行中の船に乗り込みました。彼らは 2/O キャビンに侵入し、彼の手を縛り、長いナイフで彼の喉を脅しました。海賊は二等航海士にマスターを呼ばせた。海賊は船長のドアの横で待っている間に、C/E を捕まえて手を縛った。船長の船室が開けられると、海賊は船長の船室に突入した。彼らは彼を長いナイフとバールで脅し、金を要求した。船長は両手を縛られ、船尾基地に追いやられました。海賊は、船の現金と乗組員の私物を持って長い木製のスキッフに飛び込み、逃走した。C/E と 2/O はなんとか自分たちを解放し、警報を発しました^Pirates は Master の手を縛り、C/E および 2/O。海賊は船の現金と船長、C/E と 2/O の現金と私物を盗みました^公海^蒸気^5-10 人^乗組員に対する暴力の脅威^ナイフ^^^^^^^^SSAS が作動し、所有者に報告^^リベリア当局^^ICC-IMB Piracy Reporting Center Kuala Lumpur^-
不明^マーシャル諸島^19846^2013-08-28^23:30^^一般貨物船^^^カムファ港^ベトナム^南シナ海^20° 59.92' N^107° 19.00' E^錨泊中、6人の強盗が錨鎖を介して船に乗り込み、船首楼店へのドアの南京錠を切り開きました。彼らは、船首楼店のロープ ハッチのターンバックルとラッシングを取り外しました。強盗は当番当直の交代中に二等航海士に目撃され、警報が作動したのを聞いて逃走した。切り開かれた。

センター シャックル 2 つとエンド シャックル 1 つが盗まれました"^ポート エリア内^錨泊^5-10 人^^なし/記載なし^メイン デッキ^^^^^^^-^^^ベトナム^"ReCAAP ISC via ReCAAPフォーカルポイント(ベトナム)

Focal Point (シンガポール)経由のReCAAP ISC"^-
コタ ビンタン^シンガポール^8441^2002-05-12^15:55^8021311^ばら積み貨物船^^UTC^^^南シナ海^^^長いナイフで武装した 7 人の強盗が、航行中に船に乗り込みました。彼らは宿泊施設のドアをこじ開け、乗組員を人質に取り、船長にキャビンのドアを無理やり開けさせました。その後、彼らは船長と乗組員を縛り上げ、船尾甲板に押し戻しました。そこから強盗は飛び降り、火の付いていないボートで逃げました。船長と士官候補生は暴行を受けました。現金、乗組員の持ち物、船の現金が盗まれた^領海^蒸し^5-10人^乗組員に対する実際の暴力^ナイフ^^^^^^2^^-^^はい。SAR、ジャカルタ、インドネシア海軍本部に通知^^ICC-IMB PRC クアラルンプール^-

1 番目と 3 番目のレコードは問題なく、解析しやすいことがわかります。2 番目のレコード "Unkown" には、ネストされた改行文字が含まれています。

このデータを SAS にインポートできるように、Python スクリプトでネストされた改行文字 (ただし、レコードの末尾にあるものではない) を削除するにはどうすればよいですか?

4

3 に答える 3

2

これを正規表現としてタグ付けしたようですが、組み込みの CSV ライブラリを使用してこれを解析することをお勧めします。CSV ライブラリはファイルを正しく解析し、必要な場所に改行を保持します。

Python CSV の例: http://docs.python.org/2/library/csv.html

于 2013-10-25T23:12:29.977 に答える
1

遭遇した区切り文字の数を数え、単一のレコードに関連付けられた数に達したときに手動で新しいレコードに切り替えることで、問題を解決しました。次に、すべての改行文字を取り除き、データを新しいファイルに書き戻しました。本質的には、フィールドから改行文字が削除された元のファイルですが、各レコードの末尾に改行文字があります。コードは次のとおりです。

f = open("events.csv", "r")

carets_per_record = 33

final_file = []
temp_file  = []
temp_str   = ''
temp_cnt   = 0

building   = False

for i, line in enumerate(f):

    # If there are no carets on the line, we are building a string
    if line.count('^') == 0:
        building = True

    # If we are not building a string, then set temp_str equal to the line
    if building is False:
        temp_str = line
    else:
        temp_str = temp_str + " " + line

    # Count the number of carets on the line
    temp_cnt = temp_str.count('^')

    # If we do not have the proper number of carets, then we are building
    if temp_cnt < carets_per_record:
        building = True

    # If we do have the proper number of carets, then we are finished
    # and we can push this line to the list
    elif temp_cnt == carets_per_record:
        building = False
        temp_file.append(temp_str)

# Strip embedded newline characters from the temp file
for i, item in enumerate(temp_file):
    final_file.append(temp_file[i].replace('\n', ''))

# Write the final_file list out to a csv final_file
g = open("new_events.csv", "wb")


# Write the lines back to the file
for item in enumerate(final_file):
    # item is a tuple, so we get the content part and append a new line
     g.write(item[1] + '\n')

# Close the files we were working with
f.close()
g.close()
于 2013-11-01T13:29:35.790 に答える