[ 新規に投稿する ]

ダブルクォーテーションで囲まれていない場合にダブルクォーNo.40909
タルタル505 さん 23/11/07 14:56 [ コメントを投稿する ]
  お世話になります。
秀丸エディタを使用しているのですがでの下記の様に置換を行いたいのですが正規表現の書き方がわかりません。どのような文字を入力すれば良いのでしょうか?
"東京都","浅草","","","神戸","横浜"

"東京都","浅草",,,"神戸","横浜"
 
よろしくお願いします。

[ ]
RE:40909 ダブルクォーテーションで囲まれていない場合にダブルNo.40910
秀丸担当 さん 23/11/07 17:36 [ コメントを投稿する ]
  csvを正規表現で正確に表現するのは、たぶん難しと思います。
前提として、""で囲まれた中にカンマが含まれていないのであれば、比較的やりやすいです。
"",や,,や^,をそのまま検索するだけになると思います。

カンマが含まれている可能性などを考慮すると、複雑です。
ちょっと考えてみたところでは、以下のようなものがそれっぽくなりましたが、体裁が整っていないcsvを整えるという目的だとすると、イレギュラーがあるかどうかちょっとわからないです。
""なら、

(?<=^(([^,\n"]*?|".*?"),)*?)("",)(?#fulllinematch)

とか、空なら、

(?<=^(([^,\n"]*?|".*?"),)*?)(,)(?#fulllinematch)

で、それぽくなりました。
もっといい表し方があったらすみません。
置換する前に、検索で[すべて検索]ボタンから色付けなどをして確認してみるといいです。

(?#fulllinematch)というのは、秀丸エディタ特有の改行を含む場合のことで、別に無くていいのですが、警告を無くすために書いたものです。

ちなみに空の内容でない普通の検索の場合、[表示]→[タブストップ]→[CSVモード(カンマ区切り)]でCSVモードにしてから、ルーラー部分をクリックして列を選択して、選択した内容を対象にすると簡単です。
あと検索の[すべて検索]でも、複数選択やカラーマーカーされた結果だけを対象にできたりします。
プログラム的に処理するには、マクロでselectcolumnとかforwardtabで調べながらやる方法もあります。
[ ]
RE:40909 ダブルクォーテーションで囲まれていない場合にダブルNo.40911
Iranoan さん 23/11/07 17:49 [ コメントを投稿する ]
  タルタル505さんこんにちは Iranoan です
> 秀丸エディタを使用しているのですがでの下記の様に置換を行いたいのですが正規表現の書き方がわかりません。どのような文字を入力すれば良いのでしょうか?
> "東京都","浅草","","","神戸","横浜"
> ↓
> "東京都","浅草",,,"神戸","横浜"
この例なら、正規表現を使わなくとも、単純に "" を空文字に置換すれば良いと思います
それでダメなケースが有るなら、具体例が示されれば、より良い回答が得られるかもしれません
[ ]
RE:40910 ダブルクォーテーションで囲まれていない場合にダブルNo.40912
(-L-) さん 23/11/08 07:54 [ コメントを投稿する ]
>csvを正規表現で正確に表現するのは、たぶん難しと思います。

話題になったので横から失礼します。
そうです。csvの正規表現は色々難しいです。
ただ、例えばですが

0,"1,234",5

というのを秀丸エディタのCSVモードで開くと"1,234"と正しく処理してくれます。(ということは秀丸エディタは判っている。)

このCSVモードで、","を ""に置換とかできると良いです。
今の仕様は、CSVの区切りとしての","と、"1,234"の中の","を同一視して置換するのですが、CSVの区切りとしての","を無視してくれると編集の幅が広がって助かります。(EXCELとか立ち上げたり、スクリプトを書かなくていい)
[ ]
RE:40912 ダブルクォーテーションで囲まれていない場合にダブルNo.40914
秀丸担当 さん 23/11/08 13:27 [ コメントを投稿する ]
  CSVやTSVで、区切りとして判断されているものを簡単に無視できたらいいです。
ネタとして検討したいと思います。

現状で列の選択や複数選択を対象にする方法や、複数行コメントのユーザー定義しておいて、それを対象にする方法などがあります。
これらの、特定の部分に絞った方法は幾つか考えられるのですが、今回のように空の内容は、やっぱり厄介です。
空の「""」や幅ゼロの「」(はできないので.*?)を検索すると、セル内の"This ""is"" a pen."や、幅ゼロは全てにマッチしてしまいます。
区切り文字を簡単に無視するネタが実現できたとしても、厄介なのは変わらないと思います。

行単位だと^との組み合わせでできるのですが、行内の部分だとできないです。
onigurumaだと\Gでそれができるっぽいので、hmjreでもでたらいいです。
とりあえずhmjreで\Gを対応してもらおうと思います。
[ ]
RE:40914 ダブルクォーテーションで囲まれていない場合にダブルNo.40915
(-L-) さん 23/11/08 13:44 [ コメントを投稿する ]
>CSVやTSVで、区切りとして判断されているものを簡単に無視できたらいいです。
>ネタとして検討したいと思います。

すべてを実現するのは難しいかもしれませんが、今以上に編集できる幅は広がるかと。

・CSVモードで表示していたら区切り文字は無視(置換対象外)
・CSVモードを解除したら、いわゆる行単位扱いで区切り文字も対象

という仕様のほうが、編集している人間の視覚的にもわかりやすい動きかと
思います。

この2つのモードをうまく切り替え、行ったり来たりしながら、正規表現を工夫して置換していくことである程度のやりたいことは解決できる。

というような幅が広がるのではないか。というイメージでいます。
[ ]
RE:40915 ダブルクォーテーションで囲まれていない場合にダブルNo.40916
(-L-) さん 23/11/08 14:48 [ コメントを投稿する ]
>・CSVモードで表示していたら区切り文字は無視(置換対象外)
>・CSVモードを解除したら、いわゆる行単位扱いで区切り文字も対象

言葉が足りなかったかもです。

>・CSVモードで表示していたら区切り文字は無視(置換対象外)

は、区切り文字をまたぐパターンマッチは行わないようなイメージでした。

なので

>・CSVモードを解除したら、いわゆる行単位扱いで区切り文字も対象

とのモード切り替えを駆使して編集していく。
[ ]
RE:40916 ダブルクォーテーションで囲まれていない場合にダブルNo.40918
秀丸担当 さん 23/11/08 16:09 [ コメントを投稿する ]
  一応いまできる方法としては、複数行コメントのユーザー定義を使う方法が考えらえます。

簡単な例として、[その他]→[ファイルタイプ別の設定]→[デザイン]→[複数行コメント]で、ユーザー定義にして、「"」から「"」までを文字定数として定義します。
検索や置換で、追加の条件をONにして、[文字定数][のみ]にすると「"」から「"」の色がついている部分だけが対象になります。

CSV向けにしてより正確にすると、
「"」から「"|$」まで
「.*?」から「(?=(,|$))」まで
の2つを定義しておくと、実質カンマだけが無視されて全部文字定数になりそうでした。
あとは検索時に、追加の条件で[文字定数][のみ]を対象にするだけで、区切り文字をまたぐパターンマッチをしないようにできそうです。

やるとしたら、こういう定義をいちいちしなくても、1つの操作だけで同等のことができたらいいです。

いろいろなやり方がありますが、区切り文字をまたぐことはなくても、区切りの最初からの検索が困難です。
それで正規表現の\Gで検索開始位置が必要で、試しに作ってもらって検証中です。
[ ]

[ 新規に投稿する ]