ダブルクォーテーションで囲まれていない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 ""i
s"" 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で検索開始位置が必要で、試しに作ってもらって検証中です。

[ ]