◀一般トップへ
  • 5499 CSV形式ファイルのフィールドのデータの交換を,正規表現の置換でできますか。
    • 5500 Re:CSV形式ファイルのフィールドのデータの交換を,正規表現の置換でできますか。
      • 5501 Re2:CSV形式ファイルのフィールドのデータの交換を,正規表現の置換でできますか。
      • 5506 $1,$2,$5,$4,$3,$6\rでもできました。
        • 5514 RE: $1,$2,$5,$4,$3,$6\rでもできました。
    • 5530 Re:CSV形式ファイルのフィールドのデータの交換を,正規表現の置換でできますか。
      • 5533 Re2:CSV形式ファイルのフィールドのデータの交換を,正規表現の置換でできますか。
  • [5499] CSV形式ファイルのフィールドのデータの交換を,正規表現の置換でできますか。 ろろ 2006年10月19日 20:15

    例えば,フィールド3とフィールド5を交換したい。
    置換前(N) $3,$4,$5 「`awk'プログラム中でフィールドを参照するには、ドル符号`$'のあとに参照した
    置換後(P) $5,$4,$3 いフィールド番号を付けます。」
    試み1)エクセルでcsvファイルを開いたら,数字が変わった。
    1:1 --->1:01:00 1:1000--->0.736111 1:200 --->0.180556
    試み2)csvエディタを使う。
    試み3)awk,perl等を使う。
    Q.サクラエディタVer 1.4.3.5 ■Perl5互換の正規表現(オンラインヘルプより)の置換で,何を入力すればできますか?
    よろしくお願いします。
    • [5500] Re:CSV形式ファイルのフィールドのデータの交換を,正規表現の置換でできますか。 じゅうじ 2006年10月20日 01:09

      ▼ ろろさん
      > 例えば,フィールド3とフィールド5を交換したい。
      > 試み1)エクセルでcsvファイルを開いたら,数字が変わった。
      > 1:1 --->1:01:00 1:1000--->0.736111 1:200 --->0.180556

      試み1)エクセルの説明です。
      1時間と1分は、1:1。59分を超えるとexcelは表示方法が変わる。
      1時間と1000分は、1000分は16時間と40分なので、17:40。これは、1日を1とすると、17.667/24=0.736111
      1時間と200分は、200分は3時間と20分なので、4:20。これは、1日を1とすると、4.333/24=0.180555。
      試み2)SAKURAではない?
      試み3)
      置換前 (.*?):(.*?):(.*?):(.*?):(.*?):(.*)\r
      置換後 \1:\2:\5:\4:\3:\6\r
      これは、最後だけ?が無くて、最長一致です。他は最短一致。
      • [5501] Re2:CSV形式ファイルのフィールドのデータの交換を,正規表現の置換でできますか。 maru 2006年10月20日 02:23

        ▼ じゅうじさん
        > 置換前 (.*?):(.*?):(.*?):(.*?):(.*?):(.*)\r
        > 置換後 \1:\2:\5:\4:\3:\6\r

        置換前 (.*?),(.*?),(.*?),(.*?),(.*?),(.*)\r
        置換後 \1,\2,\5,\4,\3,\6\r
        の勘違い?
      • [5506] $1,$2,$5,$4,$3,$6\rでもできました。 ろろ 2006年10月21日 12:13

        ▼ じゅうじさん
        > 試み2)SAKURAではない?
        http://www.asukaze.net/soft/cassava/
        > 試み3)
        (サクラエディタVer 1.4.3.5ヘルプファイル 正規表現ライブラリについてより
        \1,\2,...:検索文字の中で( )で括られた範囲にマッチした文字列。
        文字列の前方から( )の登場順に\1,\2,\3,...となる。)
        (perlre.1.txtのPerl manpages Last change: Release 5.0 Patchlevel 00 4より
        s/^([^ ]*) *([^ ]*)/$2 $1/; # 最初の 2 語を入替える)
        置換後 \1,\2,\5,\4,\3,\6\r 置換後 $1,$2,$5,$4,$3,$6\r
        どちらでもできました。違いは,何でしょうか?
        • [5514] RE: $1,$2,$5,$4,$3,$6\rでもできました。 すい 2006年10月22日 00:26

          >置換後 \1,\2,\5,\4,\3,\6\r 置換後 $1,$2,$5,$4,$3,$6\r
          >どちらでもできました。違いは,何でしょうか?

          サクラエディタで使用されている正規表現の機能 BREGEXP.DLL は
          perl というユーティリティと互換の物となっています。

          perl では、
          ----------
          ◎ \1,\2,\3,...
           正規表現の中では () にマッチした箇所を後方参照する。

          ◎ $1,$2,$3,...
           正規表現の中で () にマッチした箇所を、正規表現の外で参照する。

          正規表現の中:検索文字列そのものの事。
          正規表現の外:検索文字列の他の場所。置換後文字列もこちら。
          ----------
          と、なっています。
          そして「正規表現の外」では \<数値> には他の機能が与えられています。

          perl 以外のユーティリティでは検索文字列中でも置換後文字列中でも
          どちらでも () などにマッチした箇所を \1,\2,\3,... で参照するように
          なっている物が多いため、perl でも置換後文字列中では あまり
          違和感が無いように \1,\2,\3,... でも極力それっぽく動くように
          作られてはいますが、それは perl としては あくまで特例扱いの
          処置だし
          (検索文字列以外では本来 \<数値> には他の機能があるし)
          常に期待通りに動くとは限らないそうです。

          perl の世界では置換後文字列中で \1,\2,\3,... は使うべきではない、
          \1,\2,\3,... を使うのは悪癖である、$1,$2,$3,... を使うべき
          と されています。


          で、サクラエディタの中では置換後文字列中では \1,\2,\3,...
          を使うか $1,$2,$3,... を使うか、となると、それは使っている
          BREGEXP.DLL が、どの程度 perl と互換に作られているかにも
          よるので、、、
          → BREGEXP.DLL の作者さんのみぞ知る。

          まあ、perl互換をうたっている以上は、使っている BREGEXP.DLL の
          ドキュメントに特記事項で「\1,\2,\3,...」の使用を推奨したりでも
          していない限り「$1,$2,$3,...」を使う方が無難でしょう。

          問題なのは、最近、あちこちで BREGEXP.DLL と互換の
          「~~版 BREGEXP.DLL」が色々出てきているので、
          その使用している「~~版 BREGEXP.DLL」毎に その辺の
          お話しも変わってくるので...
    • [5530] Re:CSV形式ファイルのフィールドのデータの交換を,正規表現の置換でできますか。 じゅうじ 2006年10月28日 11:56

      ▼ ろろさん
      > 例えば,フィールド3とフィールド5を交換したい。
      > 試み1)エクセルでcsvファイルを開いたら,数字が変わった。
      > 1:1 --->1:01:00 1:1000--->0.736111 1:200 --->0.180556

      Excelの話です。
      準備、並び替えるファイルの内容が変更できなくても大丈夫、ファイル名を変える事が出来れば拡張子を.CSV以外に変更して下さい。
      Excelのファイルメニューから開くを選び、並べ替えたいファイルをメニューから選びます。
      カンマ区切りを指定して、右端の桁まで表示し、Shift+左クリックで全て選択し、文字形式で読み込みます。

      ちなみに、最新のSAKURAで、検索に「(.*?),」を30個指定すると固まります。(バージョン略)
      • [5533] Re2:CSV形式ファイルのフィールドのデータの交換を,正規表現の置換でできますか。 げんた 2006年10月29日 00:04

        >検索に「(.*?),」を30個指定すると固まります。
        30個までは行かなくても固まりますね.
        ((.*?),){30} だと固まらない.

        正規表現でマッチする長さによって計算量が指数的に増えるパターンで固まることはあります.
        カンマに出くわしたときに.*?の部分がカンマを含む場合と含まない場合の両方を試す必要があるので検索パターンにカンマがたくさんあると指数的に計算時間が増加するのではないかと思います.
        .*?を[^,]*に変えると固まらなくなります.