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。この問題を処理するには、入力フィールドを解析して計算できるより複雑なスクリプトが必要です。

答え2

あなたはそれを使用することができますawk

awk '{
  while (NF < 5  && getline cmp) { $0=$0"<br>"cmp }
  if (NF > 5) {
    print "#ERROR"
    count++
  }
  print
}
END{
  if (count) {
    print "FAILED "count" lines" > "/dev/stderr"
    exit 8
  }
}' FS=$'\x1c'
  • awk指定された区切り文字を持つフィールドの解析に最適
  • NF現在行のフィールド数を通知します。
  • 改行が常に2番目のフィールドにあることを確認し、いつ行を完成させるべきかを知ることができます。次の行を読み、貼り付けるだけです。スペースで表示する<br>よりも優れています。情報を失います。
  • 行の最後のフィールドに改行文字が表示される場合はさらに難しくなりますが、とにかくこのスクリプトはエラーをキャッチするのが安全です。

アスタ?

答え3

使用幸せ(以前のPerl_6)

raku -e 'slurp.split("\x1C").join("\t").put;'  

入力例(タブ区切り):

~$ cat FS_test.txt
001 Baker St.
London  3   4   7
002 Penny Lane
Liverpool   88  5   7

~$ cat FS_test.txt | xxd
00000000: 3030 3109 4261 6b65 7220 5374 2e0a 4c6f  001.Baker St..Lo
00000010: 6e64 6f6e 0933 0934 0937 0a30 3032 0950  ndon.3.4.7.002.P
00000020: 656e 6e79 204c 616e 650a 4c69 7665 7270  enny Lane.Liverp
00000030: 6f6f 6c09 3838 0935 0937 0a              ool.88.5.7.

タブ文字を次に変換しますFS(MacOSのView Hexを使用xxd)。

~$ raku -e 'slurp.split("\t").join("\x1C").put;' baker_st_FS_test.txt | xxd
00000000: 3030 311c 4261 6b65 7220 5374 2e0a 4c6f  001.Baker St..Lo
00000010: 6e64 6f6e 1c33 1c34 1c37 0a30 3032 1c50  ndon.3.4.7.002.P
00000020: 656e 6e79 204c 616e 650a 4c69 7665 7270  enny Lane.Liverp
00000030: 6f6f 6c1c 3838 1c35 1c37 0a0a            ool.88.5.7..

タブを-に変換してFSもう一度元に戻します(FS-to-tabs):

~$ cat FS_test.txt | raku -e 'slurp.split("\t").join("\x1C").put;' | raku -e 'slurp.split("\x1C").join("\t").put;'
001 Baker St.
London  3   4   7
002 Penny Lane
Liverpool   88  5   7


~$ cat FS_test.txt | raku -e 'slurp.split("\t").join("\x1C").put;' | raku -e 'slurp.split("\x1C").join("\t").put;' | xxd
00000000: 3030 3109 4261 6b65 7220 5374 2e0a 4c6f  001.Baker St..Lo
00000010: 6e64 6f6e 0933 0934 0937 0a30 3032 0950  ndon.3.4.7.002.P
00000020: 656e 6e79 204c 616e 650a 4c69 7665 7270  enny Lane.Liverp
00000030: 6f6f 6c09 3838 0935 0937 0a0a 0a         ool.88.5.7...

各分割/マージの往復は、ファイルの末尾に空白行を追加します。.subst(/\n/, :nth(*))Finalの前にルーチン呼び出しを挿入して、これらの問題を排除してください.put。または、.trim-trailingスラッピングされたファイルを実行して末尾の空白をすべて削除します。 (また、hexビューアのアイデアを提供した@casに感謝します)。


付録: Rakuのtransポストルーチンも動作します:

raku -e 'slurp.trans("\x1C" => "\t").put;'

https://raku.org

関連情報