3

ColdFusion 10 と CFSpreadSheet を使用してスプレッドシートの処理を自動化しようとしています。これまでのところ、問題なくファイルを読み込んでクエリ オブジェクトをダンプできます。

<cfspreadsheet action="read" src="#theFile#" query="qData" headerrow="1" columns="1,8,9,11,33"/>
<cfdump var="#qData#"/>  

cfdump出力

問題は、データを操作しようとしたときに発生します。私が次のようなことをした場合:

<cfoutput query="qData" maxrows="#qData.RecordCount#">
    #qData.GROUP#<br />
    #qData.DOB#<br />
</cfoutput>

すぐにエラーが表示されます:「エレメント GROUP は QDATA で定義されていません。」

qData.ColumnList をダンプすると、列リストが得られます。

BTBN(002),DOB ,GROUP ,MEMBER/DEPENDENT NAME ,REL

それはスペースと ( ) がめちゃくちゃですか? もしそうなら、どうすればそれらを取り除き、ファイルを読み込むとき、またはその直後に列名を更新できますか?

4

3 に答える 3

3

最初は、「グループ」が予約済みの SQL キーワードであることが原因であると考えていました。(クエリのクエリでその列名を使用しないでください。)

既知の値の最初の行の値をサニタイズしてファイルを再保存する代わりに、ループして isValid("variablename", ColumnName) を使用して列名が有効かどうかを判断し、RenameColumn UDF を使用して名前を変更する必要があります。クライアントの元の Excel ファイルを変更しないことが重要であるため、この方法をお勧めします (特に、Adobe ColdFusion にはファイルの書き込み時にいくつかのバグがあり、ファイル内の他のワークシートや書式設定を台無しにする可能性があるため)。

不正な文字を削除する簡単な方法は、rereplace を使用することです。

ReReplace(NewColumnName, "[^a-zA-Z0-9!]", "", "ALL")

ただし、新しい列名が空ではなく、文字で始まり、別の列でまだ使用されていないことも確認する必要があります。列が特定の順序になっていることが予想される場合は、安全に名前を「col_1」に変更できます (または、一意でない列名や不正な列名のデフォルトのフォールバックとして番号付けを使用します)。

この 2011 年のブログ投稿から取得した RenameColumn UDF を次に示します。

http://www.neiland.net/blog/article/using-java-to-rename-columns-in-a-coldfusion-query-object/

<cffunction name="renameColumn" access="public" output="false" returntype="query" hint="Uses java to rename a given query object column">
  <cfargument name="queryObj" required="true" type="query">
  <cfargument name="oldColName" required="true" type="string">
  <cfargument name="newColName" required="true" type="string">

  <!--- Get an array of the current column names --->
  <cfset var colNameArray = queryObj.getColumnNames()>
  <cfset var i = 0>

  <!--- Loop through the name array and try match the current column name with the target col name--->
  <cfif arrayLen(colNameArray)>
        <cfloop from="1" to="#arrayLen(colNameArray)#" index="i">
              <!--- If we find the target col name change to the new name --->
              <cfif compareNoCase(colNameArray[i],arguments.oldColName) EQ 0>
                    <cfset colNameArray[i] = arguments.newColName>
              </cfif>
        </cfloop>
  </cfif>

  <!--- Update the column names with the updated name array --->
  <cfset queryObj.setColumnNames(colNameArray)>

  <cfreturn queryObj />
</cffunction>
于 2016-04-07T16:35:13.940 に答える
1

(コメントを読まない人がいる場合に備えて...)

括弧とスラッシュは、標準の変数名規則に準拠していないため、問題になります。最も簡単なオプションは、代わりに「columnNames」属性を使用して有効な列名を指定することです。(また、ご質問とは関係ありませんが、ヘッダー行を除外したい場合は を使用してくださいexcludeHeaderRow="true")

<cfspreadsheet action="read" src="c:\path\file.xlsx" 
     query="qData" 
     columnNames="BTBN_002,DOB,GROUP_NAME,MEMBER_DEPEND_NAME,REL"
     excludeHeaderRow="true"
     headerrow="1" 
     ... />

ほとんどの場合、連想配列表記を使用して無効な列名にアクセスすることもできます。ただし、「columnNames」属性を使用すると、よりシンプルでクリーンな IMO になります。

<cfoutput query="qData" maxrows="#qData.RecordCount#">
    #qData["BTBN(002)"][currentRow]#<br />
    ....
</cfoutput>
于 2016-04-07T17:42:38.747 に答える