[pgsql-jp: 33610] Re: 改行の問題について

もり mmmd6 @ yahoo.co.jp
2004年 7月 10日 (土) 16:50:14 JST


もりです。

> なので、もともとは印字ヘッドを行頭へ戻す(CR)のと一行分用紙を送る(LF)
> のふたつの動作に分かれていたタイプライタ由来のものですよね。
> 端末がテレタイプのようなものだった時代には、十分な意味があったのだと
> 思います。

  プリンタの種類によっては、今でも意味があると思います。
  昔のディスプレイ端末でもプリンタと同様な制御コードの動きをするものも
ありましたし。
  APLなどの特殊文字を扱う言語やヨーロッパの一部の言語系では、重ね打ち
印字が必要だったので、BACKSPACEなども文字を消さない本当のバックスペー
スでした。このような言語系ではCR LFも重要な要素ですよね。
  それにしても改行コードの問題は昔からいろいろトラブルの種になりますね。
  HTTPやMIME中では、公式形式ではCRLFですが、実際にはCR、LFの単独の出現
も許してますし。
  RFCどおりにアプリケーションを作ろうとすると上記のようなCR LF解釈が結
構面倒になります。実際のアプリケーションでは、CR LFとLFを受け付け、CR
のみの単独出現を許可していないものも多いように思います。apacheもそうで
すし。

  蛇足が多くなってしまいました。(^^;;
  本題です。

  実際に二宮さんがおっしゃっているテーブルを作成しました。

>            Table "public.id1tfs"
>  Column |        Type          | Modifiers
> --------+-----------------------+-----------
>  name   | character varying(30) |
>  posi   | integer             |
>  strand | character(1)          |
>  hm     | real                |
>  tfs    | real                |
>  seq    | text                |

  また、実際に以下の内容のファイルを作成し、改行コードをCR(0x0D)としま
した。EOFは入れていません。
== ファイル名(datacr) ==
V$STAT1_03|10093|-|0.929|0.918|aAGAATca
V$STAT3_02|10093|-|0.860|0.860|AAGAAtca
V$STAT4_01|10093|-|0.971|0.942|aaGAATCa
V$STAT5A_03|10093|-|0.959|0.936|aAGAATca
V$STAT5A_04|10093|-|0.998|0.988|aAGAATca
V$STAT6_01|10093|-|0.960|0.933|aaGAATCa
V$STAT6_02|10093|-|0.942|0.936|aAGAATca
V$AP1_Q4_01|10094|+|0.918|0.857|agAATCAt
V$GATA_Q6|10094|-|0.825|0.815|aGAATCa
V$EN1_01|10095|-|0.806|0.794|gaATCAT
== ここまで ==

== 参考までにバイナリダンプ結果です ==
00000000  56245354 4154315f 30337c31 30303933  V$STAT1_03|10093
00000010  7c2d7c30 2e393239 7c302e39 31387c61  |-|0.929|0.918|a
00000020  41474141 5463610d 56245354 4154335f  AGAATca.V$STAT3_
  中略
00000170  317c3130 3039357c 2d7c302e 3830367c  1|10095|-|0.806|
00000180  302e3739 347c6761 41544341 540d      0.794|gaATCAT.
== ここまで ==

  実行結果です。
tt=# \copy id1tfs from /tmp/datacr with delimiter '|'
\.
ERROR:  literal newline found in data
HINT:  Use "\n" to represent newline.
CONTEXT:  COPY id1tfs, line 11: ""

  皆さんの予測通りですね。
  で、CRをLFに変換して
cat datacr | tr '\r' '\n' > datalf

  実行結果です。
tt=# \copy id1tfs from /tmp/datalf with delimiter '|'
\.

tt=# select * from id1tfs;
    name     | posi  | strand |  hm   |  tfs  |   seq
-------------+-------+--------+-------+-------+----------
 V$STAT1_03  | 10093 | -      | 0.929 | 0.918 | aAGAATca
 V$STAT3_02  | 10093 | -      |  0.86 |  0.86 | AAGAAtca
 V$STAT4_01  | 10093 | -      | 0.971 | 0.942 | aaGAATCa
 V$STAT5A_03 | 10093 | -      | 0.959 | 0.936 | aAGAATca
 V$STAT5A_04 | 10093 | -      | 0.998 | 0.988 | aAGAATca
 V$STAT6_01  | 10093 | -      |  0.96 | 0.933 | aaGAATCa
 V$STAT6_02  | 10093 | -      | 0.942 | 0.936 | aAGAATca
 V$AP1_Q4_01 | 10094 | +      | 0.918 | 0.857 | agAATCAt
 V$GATA_Q6   | 10094 | -      | 0.825 | 0.815 | aGAATCa
 V$EN1_01    | 10095 | -      | 0.806 | 0.794 | gaATCAT
(10 rows)

  めでたく成功しました。
  ということで、tr等を使って改行を編集して下さい。
cat datacr | tr '\r' '\n' > datalf


__________________________________________________
Do You Yahoo!?
http://bb.yahoo.co.jp/




pgsql-jp メーリングリストの案内