1 2 前へ 次へ 15 返信 最新の回答 日時: Dec 29, 2015 4:58 PM ユーザー:smileheart

    csv書き出しでヘッダをつける方法

    smileheart

      csvでレコードの書き出しをする際、ヘッダ情報を1行目に書く方法はないでしょうか?

      今は、スクリプトで書いていますが、いい方法とは思っていません。

      できれば、計算式を使いスマートに出したいと思います。

      よろしくお願いします。

       

      WIN7  FM14  です

        • 1. Re: csv書き出しでヘッダをつける方法
          fukky

          エクスポート時に Merge 形式を選択して、拡張子を .csv で書き出せば良いでしょう。

          ヘッダ行付きの CSV ファイルとして書き出しできます。

           

          ソリューション開発に求められるのはスマートさではなく正確さですよ。

          • 2. Re: csv書き出しでヘッダをつける方法
            smileheart

            ご連絡ありがとうございます。

             

            Merge 形式の場合、""がついてしまい、読み込み先で対応できないで困っています。

            これは、解決方法はあるでしょうか?

            • 3. Re: csv書き出しでヘッダをつける方法
              fukky

              項目が "" で囲われるのは CSV 形式の仕様です。

              別のトピックスや他の掲示板でご質問なさっているようですからそちらで解決を探るのがベストプラクティスでは?

               

              闇雲に解決のための場を広げてしまうのは好まれません。

               

              また、 "ヘッダを付けた上で "" で囲われていない CSV を出力したい"

               

              というのが求めている最適解だとしたら最初からそのように質問されたほうが良いですよ。

              情報を後付けしていくとそれまでの解決策が無駄になってしまうこともあり、お力添え下さる方々にも失礼でしょう。

              • 4. Re: csv書き出しでヘッダをつける方法
                smileheart

                ご連絡ありがとうございます。

                 

                ご回答を頂いたのにご気分を損ねてしまい申し訳ありません。

                 

                CSV形式の仕様は理解できていませんでした。

                また、前回の質問とは違う案件でしたので連動した質問になるとは思っていませんでした。

                 

                前回の質問では、連文で書き出すかXMLで行うかでしたが、

                連文だとフィールド名がつきませんので、XMLで行うということになりますんね。。

                 

                XMLは試しているところです。これでできればいいですが。。

                 

                また、お気付きの点がありましたら、ご指導をお願いします。

                • 5. Re: csv書き出しでヘッダをつける方法
                  fukky

                  "" が付かない CSV が必要な案件と

                  "" が付かずにかつヘッダ付きの CSV が必要な案件があるのですね。

                  こちらこそ早とちりのようで失礼しました。

                   

                  汎用性には欠けますが「,」でフィールドの値を結合した計算フィールドを書き出すのが早いのではと思います。

                  ヘッダ行では GetFieldName でフィールド名そのものを取得すれば、万が一フィールド名が変更されても大丈夫です。

                  • 6. Re: csv書き出しでヘッダをつける方法
                    smileheart

                    ご回答ありがとうございます。

                     

                    GetFieldNameを使う場合は、スクリプトでヘッダをつくるのでしょうか?

                    手順は以下のように理解していますが、間違いないでしょうか?

                    GetFieldName でフィールドの値をスクリプト変数で持つ

                    ②書き出し用の専用テーブルを開き、既存データを全て削除

                    ③変数で持ったフィールド名を1レコード目に格納

                    ④書き出したいテーブルの内容をインポート

                    ⑤連文形式でCSV書き出し


                    上記のように思っていましたが、書いているうちに違うように思えました。

                    1レコード目が、1レコード目として認識できれば、IF文と GetFieldName でヘッダがつけられるように思います。

                    この場合は、1コレード目だと認識させる方法はあるのでしょうか?

                    取得関数を探してみましたが、該当するものは見当たりませんでした。

                    • 7. Re: csv書き出しでヘッダをつける方法
                      user14047

                      Re: CSV書き出しをした際につく、ダブルコーテーションを外したいのですが、できずに困っています。

                       

                      ここで紹介した xsl の 19 行目と 29 行目を削除して、コメントアウトしている部分を有効にすると

                      フィールド名を頭につけた上で "" で囲まない csv 書き出しが出来るようになっていますよ。

                      • 8. Re: csv書き出しでヘッダをつける方法
                        fukky

                        書き出し専用のテーブルがあるなら話は簡単でしょう。

                         

                        flg_ヘッダ としたフィールドに 1 でも入れておき、

                        flg_ヘッダ = 1 の場合のみ GetFieldName でフィールド名が入り、

                        それ以外はフィールドの値が入る計算式をエクスポート用に作成するだけです。

                         

                        flg_ヘッダ 降順のソートを行えば、ヘッダ行は必ず1行目になり、

                        続くソート順で書き出し順もお好みで変更できるでしょう。

                         

                        インポートの前に flg_ヘッダ が 1 以外のレコードを削除すれば毎回ヘッダレコードを作る必要もありません。

                        • 9. Re: csv書き出しでヘッダをつける方法
                          fukky

                          ベストプラクティスが出ましたネ

                          • 10. Re: csv書き出しでヘッダをつける方法
                            smileheart

                            なるほど!

                            ありがとうございます。

                             

                            試してみます!

                            • 11. Re: csv書き出しでヘッダをつける方法
                              user14047

                              削除するコメント行は19行目じゃなくて18行目でした。

                              このサンプルファイル何をやっているかというと、

                              1. レコードのエクスポートのタイプを XML にして保存ボタンをクリック
                              2. XML と XSL オプションの指定で、文法はそのまま FMPXMLRESULT で、XSL スタイルシートにチェックを入れ .xsl ファイルを指定
                              3. エクスポートするフィールドとフィールド順を指定してエクスポート

                              をしたいがために、2. で使う .xsl  ファイルを事前にフィールド内容のエクスポートで準備し、そのパスを変数にし xsl ファイルのパスを変数で指定してエクスポートさせているだけです。

                               

                              # またもや言い忘れてしまいましたが、アウトプットのエンコードは UTF-8 固定です。

                              • 12. Re: csv書き出しでヘッダをつける方法
                                Hiro.

                                XMLエキスポートは難解ですよネ。

                                しかも、win環境だと改行がダブって2重出力される伝統的バグがあったような!!^^;

                                 

                                そこで、より簡単な代案を!

                                グローバルフィールドへ「計算式による全置換」を適用することで 任意形式のフォーマット文を生成し、

                                そのGフィールドを「フィールド内容のエキスポート」で出力するだけです。

                                (※なお 唯一の制約は、出力の文字コードがUNICODE(UTF-16)となること、だけです。)


                                ●グローバル格納のテキストフィールド「Gフィールド」を追加作成。

                                ●検索やソート結果を出力する場合は、必要なレコード処理を準備。

                                ●「Gフィールド」に下式計算値で「フィールド内容の全置換」する。

                                 

                                Let([

                                 $exp=Case(Get(レコード番号)=1; Substitute(List("フィールド名1";"フィールド名2";"フィールド名n");[¶;","]); $exp);

                                 $exp=List($exp; Substitute(List(テーブル名::フィールド名1;テーブル名::フィールド名2;テーブル名::フィールド名n);[¶;","]))

                                ];

                                 Case(Get(レコード番号)=Get(対象レコード数);Substitute($exp; [¶;Char(13)&Char(10)]))  //FM改行コード→Win改行コードへ変換

                                )

                                 

                                 

                                 

                                「Gフィールド」を「フィールド内容のエキスポート」して、完了。

                                ●以上の流れをスクリプト化して記憶しておくと楽でしょう。

                                • 13. Re: csv書き出しでヘッダをつける方法
                                  smileheart

                                  Hiroさん

                                   

                                  ありがとうございます!

                                  確認させて頂きます!

                                  • 14. Re: csv書き出しでヘッダをつける方法
                                    Hiro.

                                    おっと! List関数を使った場合の空欄も出力させる対策を忘れてた!^^;

                                    下式に変更ください。

                                     

                                    Let([

                                     $exp=Case(Get(レコード番号)=1; Let([$non=Char(8203)]; Substitute(List("フィールド名1";"フィールド名2";"フィールド名n");[¶;","])); $exp);

                                     $exp=List($exp; Substitute(List(テーブル名::フィールド名1&$non; テーブル名::フィールド名2&$non; テーブル名::フィールド名n&$non);[¶;","]))

                                    ];

                                     Case(Get(レコード番号)=Get(対象レコード数);Substitute($exp; [¶;Char(13)&Char(10)]; [$non;""]))  //FM改行コード→Win改行コードへ変換

                                    )

                                    1 2 前へ 次へ