CSVから新しい行文字を削除する方法は? csvはファイル区切り文字(\ u001C)を区切り文字として使用します。

CSVから新しい行文字を削除する方法は? csvはファイル区切り文字(\ u001C)を区切り文字として使用します。

フィールド区切り文字には、ファイル区切り文字を含む150を超える列を持つCSVファイルがあります。問題は、列の1つに改行文字が含まれることです。そのためには、これらを削除したいと思います。

入力データ

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

出力データ

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

ベストアンサー1

出力にhdFS文字(16進数)を表示するために使用されます。1c

$ perl -0777 -pe 's/^(\d{3}.*)\n/$1/mg' input.txt | hd
00000000  30 30 31 1c 42 61 6b 65  72 20 53 74 2e 4c 6f 6e  |001.Baker St.Lon|
00000010  64 6f 6e 1c 33 1c 34 1c  37 0a 30 30 32 1c 50 65  |don.3.4.7.002.Pe|
00000020  6e 6e 79 20 4c 61 6e 65  4c 69 76 65 72 70 6f 6f  |nny LaneLiverpoo|
00000030  6c 1c 38 38 1c 35 1c 37  0a                       |l.88.5.7.|
00000039

そうでない場合、hd出力は次のようになります(FS文字は見えませんが、まだ存在するため〜する-i別のファイルにリダイレクトされた場合、または「場所で編集」オプションが使用されている場合は出力にある場合):

$ perl -0777 -pe 's/^(\d{3}.*)\n/$1/mg' input.txt   
001Baker St.London347
002Penny LaneLiverpool8857

どちらの場合も、このPerlスクリプトはファイル全体を一度に読み取り(-0777)、各「行」(3桁の数字で始まり、次の改行文字を含まない一連の文字)をキャプチャしてからキャプチャされたテキストに置き換えます。 (改行なし)。つまり、3桁の数字で始まる「行」から改行文字を削除します。

$1不要な改行文字を直接削除する代わりに空白に置き換えるには、RHSの後にスペースを追加してください。または、\x1c改行文字をFS文字に変更したい場合。

検索s///と置換操作では、m(「複数行の文字列」)およびg(「グローバル」)正規表現修飾子を使用します。 g正規表現(sedを含む)を使用し、正規表現に「グローバル」反復一致を実行させる複数のツールに共通ですが、mPerlに固有のものです。

ソースman perlre(「修飾子」セクションを検索):

m一致する文字列を複数行として扱います。つまり、文字列の最初の行の先頭と最後の行の終わりを一致させることから、文字列のすべての行の先頭と終わりを一致させることに^変更します。$

注1:このスクリプトは、「フィールド」区切り文字が何であるかは関係ありません。フィールドをまったく検索または使用しません。フィールド区切り文字がスペース、タブ、コロン、またはその他の項目(もちろん改行文字を除く)の場合にも機能します。

注2:不要な改行文字の後に続くフィールドが3桁の数字で始まる場合、この方法は機能しません123 London。この問題を処理するには、入力フィールドを解析して計算できるより複雑なスクリプトが必要です。

おすすめ記事