CSVデータの検索No.06439
santoku さん 11/04/20 16:41
 

秀丸エディタ Ver 8.03

// 3行のCSVデータここから
1,2,3,4,5,6,7,8,9,10,11,12,13,14
123,東北,とうほく,TOUHOKU,"abc,def",東北,とうほく,"abc,def",123,東北,
とうほく,TOUHOKU,"abc,def",東北
123,東北,とうほく,TOUHOKU,"abc,def",東北,とうほく,"abc,def",123,東北,
とうほく,TOUHOKU,"abc,def",東北
// 3行のCSVデータここまで

検索文1:  ^([\t ]*(".*?[^"]"|""|[^,]*)[\t ]*,){5}[^,]*
検索文2:  ^([\t ]*(".*?[^"]"|""|[^,]*)[\t ]*,){9}[^,]*

上の検索文でCSVデータを検索します。
検索文1ではカラム6(F)の東北まで、検索文2ではカラム10(J)の東北までが検索さ
れます。
これは期待する結果と同じです。

次に下の検索文で検索します。

検索文3:  (?<=^([\t ]*(".*?[^"]"|""|[^,]*)[\t ]*,){5}[^,]*)東北
検索文4:  (?<=^([\t ]*(".*?[^"]"|""|[^,]*)[\t ]*,){9}[^,]*)東北

検索文3ではカラム6(F)の東北が検索されます。
検索文4ではカラム14(N)の東北が検索されます。

検索文4で期待するのはカラム10の東北にヒットすることなのですが、これは検索文
に問題があるのでしょうか?

また、行末にカンマを置きCSVデータの全文を横に連結(BOX貼り付け)します。

検索文5:  (?<=^([\t ]*(".*?[^"]"|""|[^,]*)[\t ]*,){14}[^,]*)東北
検索文6:  (?<=^([\t ]*(".*?[^"]"|""|[^,]*)[\t ]*,){18}[^,]*)東北
検索文7:  (?<=^([\t ]*(".*?[^"]"|""|[^,]*)[\t ]*,){23}[^,]*)東北

検索文5はカラム19(S)、検索文6はカラム19(S)、検索文7はカラム24(X)の東北に
ヒットします。
検索文5だけが期待とは異なる結果です。

[ ]
RE:06439 CSVデータの検索No.06440
santoku さん 11/04/20 17:07
 
補足:
CSVモードで編集しています。

[ ]
RE:06440 CSVデータの検索No.06441
秀まるお さん 11/04/21 10:01
 
 HmJre.dll担当ということで僕がお返事させていただきます。

 こちらでテストしてみたら、たしかにヒットする位置がおかしいようですが、
うまくいかない原因としては、

 "abc,def",

 のようなのがあるとダメということのようでした。なぜおかしいのかというこ
とで考えてみたら、

    (".*?[^"]"|""|[^,]*)[\t ]*,

 の部分が、

 [^,]*[\t ]*,

 と解釈されるケースで、それが

    "abc,

 や

    def",

 に対してマッチングしてしまうのが原因のような気がします。

 なので、そこの正規表現を、

   ("[^\"]*?"|[^,\"]*)[\t ]*,

 としてやればうまくいきます。

 トータルで直すと、検索文4は、

検索文4:  (?<=^(("[^\"]*?"|[^,\"]*)[\t ]*,){9})東北

 ということで期待した所にヒットしました。

 ということでどうでしょ?

[ ]
RE:06441 CSVデータの検索No.06443
santoku さん 11/04/21 18:16
 
質問の例題が適切でなかったようです。申し訳ない。

// 6行のCSVデータここから
1,2,3,4,5,6,7,8,9,10,11,12,13,14
1,東北,とうほく,TOUHOKU,"abc,def",東北,とうほく,"abc,def",123,東北,
とうほく,TOUHOKU,"abc,def",東北
2,東北,とうほく,TOUHOKU,"ab""c,def",東北,とうほく,"abc,def",123,東北,
とうほく,TOUHOKU,"abc,def",東北
3,東北,とうほく,TOUHOKU,"abc,def",東北,とうほく,"abc,def",123,"東北",
とうほく,TOUHOKU,"abc,def",東北
4,関東,かんとう,KANTOU,"abc,def",関東,かんとう,"abc,d""ef",123,関東,
かんとう,KANTOU,"abc,def",関東
5,関東,かんとう,KANTOU,"abc,def",関東,かんとう,"abc,d""ef",123,"関,東",
かんとう,KANTOU,"abc,def",関東
// 6行のCSVデータここまで


示してくださった検索文ではダメでした。

(?<=^(("[^"]*?"|[^,"]*)[\t ]*,){9})東

とすると、第2行のカラム10(J)の「東」にしかヒットしません。
そこで、初回の投稿にある検索文を見直しました。

(?<=^([\t ]*(".*?[^"]"|""|[^,"]*)[\t ]*,){9}[^,]*)東

第5行がヒットしないので次のように修正

(?<=^([\t ]*(".*?[^"]"|""|[^,"]*)[\t ]*,){9}("[^"]*?|[^,"]*))東

「東」の前にエスケープした引用符があるとヒットしないのですが、それに対応する
のは無理だと思うので、これで良しとします。

お付き合い、ありがとうございました。

[ ]
RE:06443 CSVデータの検索No.06444
秀まるお さん 11/04/21 18:55
 
 いろいろややこしいパターンもあるということで…。そこまで頭が回りません
でした。

 CSV形式をそのまま正規表現で扱うのは面倒そうなので、一度TSV形式に変換し
てから処理するといいかもしれないなぁと思いました。

 CSV形式のカラム1つにうまくヒットする正規表現パターンとしては、僕が思
うには、

[\t ]*(("([^\"]*(|"")[^\"]*)*")|([^\",]*))[\t ]*,

 とするといいかと思いました。ただし、このやり方だと繰り返しパターンが2
重ネストになって、さらにこれを{9}で囲むとトータル3重ネストになるので、
極端に遅くなる危険性はあるかなぁと思います。

[ ]
RE:06444 CSVデータの検索No.06445
santoku さん 11/04/21 19:08
 
> CSV形式をそのまま正規表現で扱うのは面倒そうなので、一度TSV形式に変換し
>てから処理するといいかもしれないなぁと思いました。

拙作のマクロに、検索・置換・GREPを総合管理するものがあり、そこにCSV/TSVのカ
ラムを指定した検索ができるマクロを追加する作業をしていての今回の質問でした。
お気遣いありがとうございます。


[ ]
RE:06445 CSVデータの検索No.06446
colder さん 11/04/21 19:57
 
colderです。

以下の正規表現でうまくいくと思います。
(?<=^([\t ]*("([^"]|"")*"|[^,]*)[\t ]*,){9}("([^"]|"")*|[^,]*))東

[ ]
RE:06446 CSVデータの検索No.06449
santoku さん 11/04/25 16:01
 
>以下の正規表現でうまくいくと思います。
>(?<=^([\t ]*("([^"]|"")*"|[^,]*)[\t ]*,){9}("([^"]|"")*|[^,]*))東

エスケープした引用符があってもヒットしますね。
無理だと決め付けるのが早かったようです。
ありがとうございました。

[ ]