Thread Rating:
  • 287 Vote(s) - 2.89 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Clipboard.get-string のバグ?
06-13-2013, 03:52 PM,
#1
Clipboard.get-string のバグ?
エクセルからコピーされたデータをClipboard 経由で、グリッドに貼り付けを行う際、
ひとつのセルのなかで改行されている場合に、Curl側でその改行を削除し、ひとつのセルの中のデータとして整形したいと思ったのですが、
うまく判別する方法を考えられませんでした。

エクセルからコピーされたデータとしては、セル内の改行は、LF(ラインフィード)になっているので、
この文字を削除すればよいかと思ったのですが、
Clipboard.get-string で取得した後の文字は、LFは、CR(キャリッジリターン)に変換されているため、
判別する基準として利用できません。

セル内に改行がある場合はダブルコーテーションでくくられるので、
それを判断の基準にしようかと思ったのですが、エスケープ(2重に)されたダブルコーテーションがあった場合や、
改行直前にダウブルコーテーションがあった場合など、
判別が複雑になるため、今のところ、連続した二つのダブルコーテーションはすべて削除してしまう、
という方法に落ち着きました。

WindowsのようにCR とLF を混合しない、Mac や Linux に対応しているための問題なのかもしれませんが、
エクセルからのコピーは、現場では多用されるので、できれば対応してもらいたいです。
Reply
06-20-2013, 11:53 AM,
#2
RE: Clipboard.get-string のバグ?

「エクセルからのコピーは、現場では多用されるので、できれば対応してもらいたいです。」
具体的に、どのような対応ですか?

ちなみに、Excelのセル内改行コードについて、このような情報もあるみたいです:

「Excelの改行コードが0Aだけなのは昔からの仕様で、なぜそうなっているのか本当の理由はわかりません。ExcelはもともとMacintosh用に開発されたアプリだから・・・という話も聞きますが、本当のところはわかりません。理由はともあれ、Excelの改行コードは0Aだけだということです。
では、セル内の改行コードはどんなときも0Aだけかというと、実は違います。手動操作でAlt+Enterキーを押してセル内改行をした場合には、改行コードとして0Aだけが入力されますが、マクロなどでユーザーが明示的に0D 0Aの改行コードを使用した場合は、そのまま0D 0Aが保存されます。実際にやってみましょう。次のマクロで、セルB2に0D 0Aで改行したデータを入力してみます。



http://officetanaka.net/excel/vba/tips/tips89.htm
Reply
06-28-2013, 01:34 PM,
#3
RE: Clipboard.get-string のバグ?
説明不足ですいません。私の「対応」が指す内容は、
キャリッジリターンと、ラインフィードを分けて取得したい、という意味です。

現在、Curlでは、キャリッジリターン、ラインフィードのどちらも LF として取得されている、という認識です。

下記サンプルでは、"\r\n"=CR+LF も、"\n"=LF も、どちらも文字コードとしては「10」で表示されます
ASCIIに準じると、各改行コードの文字は、CR(復帰、0x0D=16)、LF(改行、0x0A=10)となり、
どちらも、int形式では 10 となることが、このように判断しました。
(NewlineSequence の指定が間違っていたらご指摘ください。)


Code:
{let input-ta:TextArea =
    {TextArea width=3in, height=1in, value="A\r\nB\nC"}}
{value input-ta}
{CommandButton
    label = "文字をintで表示する",
    {on Action do
        def input =
            {NewlineFilterTextInputStream
                {input-ta.value.to-InputStream},
                newline-sequence = NewlineSequence.all
            }
        {while not input.end-of-stream? do
            {popup-message {input.read-one} asa int}
        }
    }
}


ただ、heavybugtracker さんが引用してくださった内容を見る限り、
キャリッジリターン、ラインフィードとを個別に判別できたとしても、
エクセルのシートからコピーされたデータをそのままグリッドに貼り付けるには、
正確に"(ダブルクォーテーション)でくくられた情報を判断する処理が必要そうですね。
Reply


Possibly Related Threads...
Thread Author Replies Views Last Post
  CsvDataReader のバグ? umemura 2 4,405 09-11-2014, 01:52 PM
Last Post: rom
  BigDecimal.to-String で、小数点桁に0が増えてしまう umemura 1 8,279 12-19-2013, 02:03 PM
Last Post: umemura
  なぜ String から BigDecimal にキャスト可能なのか umemura 2 4,473 12-12-2013, 01:24 PM
Last Post: crispincross
  RecordSort として String をパースすることはできませんでした umemura 2 3,699 11-01-2011, 04:09 PM
Last Post: c-s
Forum Jump:


Users browsing this thread:
1 Guest(s)