[あすかぜ・ねっと]あすかぜ・ねっと自作ソフトCassava > サポート掲示板

Cassava Editor サポート掲示板

スレッド一覧に戻る
題名:
名前:
e-mail:
URL:
この情報を次回も使用する


スレッド一覧に戻る返信

[503] セル中のLFが保存時CR+LFに置き換えられてしまいます。

あき [2019/06/12 21:39:20]

お世話になっております。
セル中にLFがあるのですが、
保存時CR+LFに置き換えられてしまいます。
LFのまま保存する方法はないでしょうか。
よろしくお願いいたします。

Re: [503] セル中のLFが保存時CR+LFに置き換えられてしまいます。

あすかぜ [2019/06/13 21:45:25]

書きこみありがとうございます。

すみませんが、今のところファイルを開くときにファイル内の改行コードを CR+LF に統一してしまっており、元々の改行コードは保存できません。
メニューから [ファイル(F)]-[保存時文字コード(C)]-[LF] を選択すれば LF での出力は可能なのですが、通常の行の区切りを含めてファイル内のすべての改行コードが LF になってしまいます。

エディタ上で CR+LF と LF を使い分けて編集可能にするのは難しそうです。
今後の改善案として、行の区切りの改行コードとセル内改行の改行コードをそれぞれ別に指定できるようにすることを検討してみたいと思います。

よろしくお願いします。

Re: [503] セル中のLFが保存時CR+LFに置き換えられてしまいます。

あき [2019/06/18 17:58:27]

あすかぜ様

回答下さりありがとうございます!
ニーズ無いですかね??
残念ですが別の方法で処理します。
ありがとうございました。

Re: [503] セル中のLFが保存時CR+LFに置き換えられてしまいます。

あすかぜ [2021/08/01 11:30:20]

Ver.2.4 α2 で、「セル内改行のみ LF」というオプションを追加してみました。
https://www.asukaze.net/soft/cassava/history/2_4dev.html

内部的には通常の改行コードとセル内改行の改行コードを別々に保持するようになっています。
UI 上は、設定がごちゃごちゃしてしまいそうだったので、「通常の改行は CR+LF、セル内改行は LF」のみ特別扱いでそれ以外設定できないようになっています。

Re: [503] セル中のLFが保存時CR+LFに置き換えられてしまいます。

いっち [2021/08/02 14:04:41]

お世話になります。

Ver.2.4 α2 で、下記のファイルを、「エクスポートした時の出力結果」を確認してみました。

・セル内改行も、CR+LFのCSVファイル
・セル内改行も、LFのCSVファイル
・セル内改行も、CRのCSVファイル
・セル内改行のみLFのファイル

下記のようになりました。

1. write(); は、元ファイルがどれでも、セル内改行をLFで書き出しました。

2. writeln();は、下記になりました。
 2-1) セル内改行も、CR+LFのCSVファイル
    CR+LFで書き出しました。
    
 2-2) セル内改行も、LFのCSVファイル
    LFで書き出しました。
 
 2-3) セル内改行も、CRのCSVファイル
    CRで書き出しました。
 
 2-4) セル内改行のみLFのファイル
    CR+LFで書き出しました。

───────────────────────────────────

// エクスポートマクロ
// 全てをエクスポート.csv.cms
writesepa = ",";
for (y=1; y<=Bottom; y++) {
 for(x=1;x<=Right;x++) {
  if(x>1){
   write(writesepa);
  }
  cellstr = replace([x,y], "\"", "\"\"");
  if (pos(cellstr,",")||pos(cellstr,"\"")||pos(cellstr,"\n")) {
   cellstr = "\"" + cellstr + "\"";
  }
  // 元ファイルがどれでも、セル内改行をLFで書き出しました。
  write(cellstr);
 }
 // 下記は、元のファイルにより変わりました。
 writeln();
}

───────────────────────────────────

エクスポートではなく、WriteToFile(); で書き出すような場合は、下記のようにすれば良いようでした。

 1) writeln(); の代わりとして、たとえば、CRLFを書き出す場合、
   crlf = chr(13)+chr(10); としたcrlfを書き出せばよいようでした。
   (\nだと、LFを書き出すようです。)

───────────────────────────────────

上記は、Cassavaの仕様でしょうか?
※私の検証内容に間違いがあるようでしたら、申し訳ありません。

───────────────────────────────────

マクロのコマンドに、「セル内改行のみLF」を指定するコマンドが無い事や、何も書かれていないファイルに入力していって、保存させる時に「セル内改行のみLF」を標準とする(優先する)指定が無い事から、なぜそうされたのか調べていて、気がついた事を書いてみました。

CR+LFのCSVファイルやセル内改行のみLFのファイルに対して、普通に書いたエクスポートマクロの実行結果が、「セル内改行のみLFのファイル」になるのでしたら、保存させる時に「セル内改行のみLF」を標準とする(優先する)指定が出来ても良いような気がして投稿してみました。
※スプレッドシートだと、CSVとしてダウンロードした場合、「セル内改行のみLFのファイル」になるようでしたからそう思いました。

Re: [503] セル中のLFが保存時CR+LFに置き換えられてしまいます。

あすかぜ [2021/08/02 21:57:56]

検証ありがとうございます。

ご指摘の通り、write(); や WriteToFile(); は改行コードの設定を反映せず、常に \n を LF で書き出すようになっています。
仕様というよりも、マクロ処理時に内部的に改行を LF で表現しているので、それがそのまま出てきてしまっている感じです。
2.3 以前のバージョンでも同じ動作となっていると思います。

改行コード CRLF のファイルを開いてエクスポートすると改行コードが LF に変わってしまうのはわかりにくいので、設定に従った改行コードでエクスポートや WriteToFile(); ができる方法があるべきかもしれません。少し考えてみます。

「セル内改行のみLF」を標準とする設定もあってもよいかもしれませんが、わざわざ設定項目を増やすほど需要がなさそうな気もします。
ちなみに、リファレンスを更新していなかったのですが、マクロからは「LfInCell();」という命令で「セル内改行のみLF」を指定できます。

Re: [503] セル中のLFが保存時CR+LFに置き換えられてしまいます。

いっち [2021/08/02 22:52:03]

お返事ありがとうございます。

>2.3 以前のバージョンでも同じ動作となっていると思います。
なんとなくそんな気もしてたのですが、きちんと検証した事がなくて、さほど気にもしていませんでした。

>少し考えてみます。
分かりました。

>わざわざ設定項目を増やすほど需要がなさそうな気もします。
今まで、「セル内改行のみLF」が無くとも、困ったことは(一度も)なかったので、そうかもしれません。

>マクロからは「LfInCell();」という命令で「セル内改行のみLF」を指定できます。
マクロからの命令があるなら、問題ないと思います。

Re: [503] セル中のLFが保存時CR+LFに置き換えられてしまいます。

いっち [2021/09/05 08:36:47]

お世話になります。

>>少し考えてみます。
>分かりました。

Cassavaの場合、普通のマクロでは、"\n" だけあれば、"\r" は必要無い為、エクスポートマクロの仕様を勘違いしていたのが間違いの始まりでした。

Ver.2.4 α3(2021/09/04) で追加された
>マクロの文字列リテラル内で "\r" を使えるようにした。
があれば、(私は)それで十分だと思いました。

>設定に従った
の部分にこだわり過ぎると、(もしかしたら)ごちゃごちゃになりそうな気もしていました。

Re: [503] セル中のLFが保存時CR+LFに置き換えられてしまいます。

あすかぜ [2021/09/05 15:13:12]

早速のコメントありがとうございます。

私も同じ考えです。
暗黙的に設定に従うためには、例えば WriteToFile("a\nb", filename); の「\n」が通常の改行なのかセル内改行なのかを Cassava Editor 側で判断できる必要があります。もしそれが実現できたとしても、かなりわかりにくい挙動となってしまいそうです。

エクスポートマクロや WriteToFile() で CR+LF を出力したい場合は、必要に応じてマクロ側で replace("\n", "\r\n") をしてもらうということにしたいと思います。

スレッド一覧に戻る返信