3 返信 最新の回答 日時: Jan 5, 2016 10:07 PM ユーザー:user14047

    複数フィールドでCSVを書き出す方法

    smileheart

      次の様なDBから、以下の様なCSVを書き出したのすが、どうすればいいでしょうか?

       

      (DB)

             フィールド A          フィールドB          フィールドC

      レコード1  りんご      みかん     いちご

      レコード2  けーき      ぱん      おにぎり

       

       

      (CSV)

       

      りんご

      みかん

      いちご

      けーき

      ぱん

      おにぎり

       

      できれば、スクリプトを使わないで、レコード毎に計算させて出力したいと思っています。

      以下の様な式を作り、書き出しをしましたが、うまくいきません。

      アドバイスをお願いします。

       

        フィールドA &Char ( 13 ) &

           フィールドB &Char ( 13 ) &

           フィールドC &Char ( 13 ) 

       

      環境は、FM14  Win7です。

       

      よく似た質問ばかりしており、回答頂いている方々には感謝します。

      今回も新しい案件です。よろしくお願いします。

        • 1. Re: 複数フィールドでCSVを書き出す方法
          user14047

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

          で XML の場合を聞かれたので、こちらに返信しておきます。

           

          今回は、フィールドの値をレコードに関係なく全て改行で繋げばいいわけですよね?

          上記スレッドの xsl ファイルのセパレータの指定を , (コンマ)ではなく、 
(CR改行)にして、フィールド名の書き出しの部分を削除しちゃえばいいだけですよ。

          Windows 環境の場合、CR 改行以外を指定すると改行が二重になってしまうように見えるため、CR 改行決め打ちということで...

           

          <?xml version="1.0" encoding="UTF-8"?>
          <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fmp="http://www.filemaker.com/fmpxmlresult" exclude-result-prefixes="fmp">
            <xsl:output method="text" version="1.0" encoding="UTF-8" indent="no" />
            <xsl:template match="fmp:FMPXMLRESULT">
             <!-- セパレーターの指定 ここではコンマでなく CR 改行で -->
             <xsl:variable name="separater"><xsl:text disable-output-escaping="yes">&#13;</xsl:text></xsl:variable>
             <!-- 改行コードを指定 LF=&#10; CR=&#13; CR+LF=&#13;&#10; -->
             <xsl:variable name="linefeed"><xsl:text disable-output-escaping="yes">&#13;</xsl:text></xsl:variable>
             <!-- フィールド数を変数に設定 -->
             <xsl:variable name="fieldCount"><xsl:value-of select="count(fmp:METADATA/fmp:FIELD)" /></xsl:variable>
             <!-- recordContents start -->
             <xsl:for-each select="fmp:RESULTSET/fmp:ROW">
              <xsl:for-each select="fmp:COL">
               <xsl:value-of select="fmp:DATA" />
               <!-- 最後のフィールド以外はセパレーターの追加 -->
               <xsl:if test="position() &lt; $fieldCount">
                <xsl:value-of select="$separater" />
               </xsl:if>
              </xsl:for-each>
              <xsl:value-of select="$linefeed" />
              </xsl:for-each>
              <!-- // recordContents end -->
            </xsl:template>
          </xsl:stylesheet>
          
          • 2. Re: 複数フィールドでCSVを書き出す方法
            smileheart

            ありがとうございます。

             

            以下に2点質問をさせてください。

             

            ①9行目でフィールド数を計算しているようですが、これは何のために行っているのでしょうか?

            ②繋げたいフィールドや順番はどのように指定するのでしょうか?

             今回のサンプルでは

             フィールド2 フィールド4 フィールド1 と繋げたい場合はどのようにするのでしょうか?

             

            以上、よろしくお願いします。

            • 3. Re: 複数フィールドでCSVを書き出す方法
              user14047

              16 行目の position() < $fieldCount という形で最後のフィールドだったら改行を足してねっていう条件分岐に使っています。

              position()!=last() でもいいような...そうなると、変数にフィールド数を入れる必要は無くなりますね。

              まぁ、いろいろな書き方があるということで...^^;

               

              2. の方はフィールドのエクスポート順を指定するだけで大丈夫ですよ。

              Field export order.png