[過去ログ] Regular Expression(正規表現) Part15 (1002レス)
上下前次1-新
抽出解除 レス栞
このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
21(2): デフォルトの名無しさん [sage] 2019/10/06(日)12:02 ID:ONMi4OJn(1)
●Regular Expressionの使用環境
※テキスト(csv)を成型するという目的なので、なんでもいいです。
フリー(ネットからDL可能)なものであれば環境を作ります。
●検索か置換か?
置換
●説明
csvファイルの第4フィールドに説明文的なものが入ってます。
ここに半角カンマが紛れています。これを全角文字(、)に置き換えたい。
第4フィールドにいくつカンマがあるかは不定です。(0の場合もあれば、2個、3個、場合によっては10個、それ以上など)
第4フィールド以外は種類は多いのですが特定の文字が入ります。また第4フィールド以外はカンマは入っていません。
各行のフィールド数は固定です。(実際は20フィールドあるのですが、省略のため5フィールドにしてます)
●対象データ
Field1,Field2,Field3,ここは説明文,Field5
Field1,Field2,Field3,説明文です,Field5
Field1,Field2,Field3,ここは説明文,ですよ,Field5
Field1,Field2,Field3,説明してる,フィールドですよ,Field5
●希望する結果
Field1,Field2,Field3,ここは説明文,Field5
Field1,Field2,Field3,説明文です,Field5
Field1,Field2,Field3,ここは説明文、ですよ,Field5
Field1,Field2,Field3,説明してる、フィールドですよ,Field5
よろしくお願いいたします。
23(2): デフォルトの名無しさん [] 2019/10/06(日)21:18 ID:QazjZrDG(1/2)
>>21
perl -ne '($a,$b,$c)=m/^((?:[^,]+,){3})(.*[^,])((?:,[^,\n]+){1})$/; $b=~s/,/、/g; print "$a$b$c\n"' input.csv
先頭の三つはカンマの数を数えて取り出し
^((?:[^,]+,){3})
フィールド数は固定とのことなので末尾側もカンマの数で取り出せる
((?:,[^,\n]+){1})$
その間が置換対象
(.*[^,])
ということで数字(3 と 1)を調整すれば実際のデータにも適用できると思います
38: デフォルトの名無しさん [] 2019/10/08(火)07:25 ID:daf3ib6k(1)
>>21
Vim
:%s/^\%([^,]*,\)\{3\}\zs\(.*\)\%(\%(,[^,\n]*\)\{1\}$\)\@=/\=substitute(submatch(0), ',', '、', 'g')/
Emacs
M-x query-replace-regexp
正規表現:
^\(\(?:[^,]*,\)\{3\}\)\(.*\)\(\(?:,[^,
]*\)\{1\}\)$
置換:
\1\,(replace-regexp-in-string "," "、" \2)\3
正規表現は>>23とほぼ同じだけど、空のフィールドに対応するよう + をすべて * に変更した
「第4フィールド」の内容がカンマだけの場合にも対応 (.*[^,]) → (.*)
上下前次1-新書関写板覧索設栞歴
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 0.041s