3

クエリからcsvファイルを作成する関数を作成しようとしています。クエリを実行した後、クエリをループして、各行のフィールドをStringBufferオブジェクトに追加します。そのために、列名を配列に入れています。

<cfset indexes = #ListToArray(Arguments.header)# />

ここで、引数は現在次のような文字列です。

"col1, col2, col3...."

ダンプすることで、クエリと配列の両方が適切であることを確認しました。クエリ結果をループするときに問題が発生します。与えられた:

<cfset indexes_length = #ArrayLen(indexes)# />
<cfloop query="query_for_csv">
        <cfloop index="i" from="1" to="#indexes_length#">
            <cfset attr = #indexes[i]# />
            <cfset sbOutput.Append(
                "#query_for_csv[attr][query_for_csv.CurrentRow]#") />
        </cfloop>           
    </cfloop> 

エラーメッセージが表示される前に、最初の行の最初の値のみが出力されます。

[Table (rows 10 columns col1, col2, col3):
[col1: coldfusion.sql.QueryColumn@6f731eba]
[col2: coldfusion.sql.QueryColumn@6ee67e7f] 
[col3: coldfusion.sql.QueryColumn@5c6647cb] 
is not indexable by col2 

変数#attr#をリテラル「col2」に置き換えると、次のようになります。

#query_for_csv['col2'][query_for_csv.CurrentRow]#

その後、ループは問題なく通過し、「col2」でインデックス付けされたすべての値を吐き出します。何か案は?

4

2 に答える 2

4

問題はヘッダーリストのスペースだと思うので、おそらくこれでうまくいくでしょう:

<cfset attr = trim(indexes[i]) />


ただし、それらを使用していないので、おそらくそれは必要なく、これを行うことができます...

<cfloop query="QueryName">
    <cfloop index="CurCol" list=#QueryName.ColumnList# >
        <cfset sbOutput.Append(
            QueryName[CurCol][QueryName.CurrentRow]
        )/>
    </cfloop>
</cfloop>


ps
ここで、ハッシュのペアは1つだけであることに注意してください。元のコードスニペット(to属性内)にも1つのペアがあれば十分です。残りは、不要なノイズです。

于 2011-11-09T18:18:31.017 に答える
2

すでに述べたように、リスト要素の前後のスペースは避けてください。

メモを比較したい場合は、Ben NadelがそのようなQuery2CSVコンバーターを実装するために選択したアプローチを確認してください:http://www.bennadel.com/blog/1239-Updated-Converting-A-ColdFusion-Query-To-CSV- Using-QueryToCSV-.htm

于 2011-11-09T18:38:19.263 に答える