いっつも vi の VISUAL BLOCK ででツラ揃えてか EXCEL 使ってパワーで編集してたんだけど「いい加減調べるか」と腹をくくったなど。
[\x00-\x7F]で、すべてのASCII文字にマッチします。これの否定の[^\x00-\x7F]とすることでASCII文字以外、つまり全角文字にマッチさせることができます。
なるほどー!
以下のようなデータが存在するとする。
INSERT INTO (generation, name, name_read, created_at, updated_at`) VALUES (3, 兎田ぺこら, うさだぺこら, 2019-07-17, NOW()); INSERT INTO (generation, name, name_read, created_at, updated_at`) VALUES (3, 潤羽るしあ, うるはるしあ, 2019-07-18, NOW()); INSERT INTO (generation, name, name_read, created_at, updated_at`) VALUES (3, 不知火フレア, しらぬいふれあ, 2019-08-07, NOW()); INSERT INTO (generation, name, name_read, created_at, updated_at`) VALUES (3, 白銀ノエル, しろがねのえる, 2019-08-08, NOW()); INSERT INTO (generation, name, name_read, created_at, updated_at`) VALUES (3, 宝鐘マリン, ほうしょうまりん, 2019-08-11, NOW());
name
name_read
はマルチバイト文字列なので ""
で囲わないと syntax error が返ってくる (はず)。ので、これをくくるにはどうするか、という話し。
上記のパターンだと冒頭の正規表現を利用して ([^\x00-\x7F]), ([^\x00-\x7F])
と検索すれば、以下のようになる。
で、 [^\x00-\x7F]
を ()
で囲っているので $
を用いて保持しておくことができる。
つまり、 $1","$2
で置換するとこうなる。
これでめんどくさい「マルチバイトに挟まるカンマ」が処せたので、あとは 3,
を 3, "
に、 , 2019-
を ", 2019-
にすれば、無事ダブルクォートで囲うことができた。
なお、上記のデータ形式なので、このような特定の値 (3 とか 2019- など) を指定した置換を実施して後処理をしているけども、それぞれ以下のように置換したほうが安全だと思う。というか最初からそうやれ。
, ([^\x00-\x7F])
を, "$1
([^\x00-\x7F]),
を$1",
もっとスマートに処理できる気がするけど、この時間にこの記事書いてる時点で察してください。