2016-11-29 54 views
1

我有一個查詢,我循環並追加到數組。循環完成後,我使用帶有製表符分隔符的ArrayToList()。問題是每行之間我有一個額外的空列。我的猜測是該命令將最後一個逗號轉換爲製表符分隔符。我仍然無法找到防止這種情況的方法。這裏是我的代碼:ArrayToList()ColdFusion?

<cfspreadsheet action="read" src="#urlPath#\Roster.xlsx" query="excelData" headerrow="1"> 

<cfset metadata = getMetaData(excelData)> 
<cfset colList = ""> 

<cfloop index="col" array="#metadata#"> 
    <cfset colList = listAppend(colList, col.name)> 
</cfloop> 

<cfset buffer=ArrayNew(1)> 
<cfset crlf=chr(13)&chr(10)/> 

<cfoutput query="excelData"> 
    <cfloop index="i" list="#colList#"> 
     <cfset ArrayAppend(buffer,excelData[i][currentRow])> 
    </cfloop> 

    //prevents blank row to be created on the end 
    <cfif excelData.currentrow eq excelData.recordcount> 
     <cfset ArrayAppend(buffer,"")> 
    <cfelse> 
     <cfset ArrayAppend(buffer,crlf)> 
    </cfif> 
</cfoutput> 

//setting tab delimiter 
<cfset test = arrayToList(buffer,chr(9))/> 

<cfscript> 
    FileWrite("#urlPath#\Test_Text.txt", "#test#"); 
</cfscript> 

下面是輸出後,我運行此代碼:

enter image description here

這裏是什麼,我需要我的輸出看起來像:

enter image description here

我選擇ArrayAppend(),因爲它比ListAppend()快得多,如果任何人都可以提供幫助請讓我知道。謝謝。

如果我緩衝器陣列的cfdump這是輸出:

array 
1 LAST_NAME 
2 FIRST_NAME 
3 BIRTH_DATE 
4 
5 Milos 
6 TestOne 
7 11/16/97 
8 

看起來像之間的每一行是空白行4和8這是我的固定日期格式問題:

<cfoutput query="excelData"> 
     <cfset thisRow = []> 
     <cfset count = 1> 
     <cfloop index="i" list="#colList#"> 
      <cfif count EQ 3 AND excelData[i][currentRow] NEQ "BIRTH_DATE"> 
       <cfset ArrayAppend(thisRow,dateFormat(excelData[i][currentRow],"mm/dd/yyyy"))> 
      <cfelse> 
       <cfset ArrayAppend(thisRow,excelData[i][currentRow])> 
      </cfif> 
      <cfset count++> 
     </cfloop> 
     <cfset ArrayAppend(buffer,arrayToList(thisRow, chr(9)))> 
    </cfoutput> 
+0

哦,不,你的陣列,例如,'[ '李四', '約翰', '1/1/1900' 的,CRLF , '李四', '簡', '1/1/1900']'。如果你在每個值之間加上一個製表符,'crlf'前後都會有一個製表符。我建議爲工作表中的每一行創建一個單獨的字符串以插入緩衝區(仍然可以使用arrayAppend然後在輸出循環中使用arrayToList),然後使用'crlf'作爲分隔符的最終arrayToList,從而不需要其他如果聲明。 –

+0

我生成了類似的基於CSV/TAB的導出...您應該修剪數據並從您添加到陣列中的值中剝離預先存在的TAB。我還遇到了Excel/Word中不可見的非破壞空格chr(160)的主要問題。關於日期,我有混合成功,喜歡使用「yyyy-mm-dd」或「m/d/yyyy」(年份使用4位數字,或者某些應用程序不會將該值視爲有效日期。) –

+0

@JamesMoberg你使用ColdFusion trim()函數還是其他的?還有你用dateFormat()來解決日期問題? –

回答

4

你的陣列,例如,

['Doe', 'John', '1/1/1900',crlf,'Doe','Jane','1/1/1900'] 

如果你把每一個這些值之間的標籤中,將成爲crlf前後的標籤。

我建議爲表格中的每一行創建一個單獨的字符串,以便插入緩衝區,然後以crlf作爲分隔符,同時排除if語句的需要。

<cfspreadsheet action="read" src="#urlPath#\Roster.xlsx" query="excelData" headerrow="1"> 

<cfset metadata = getMetaData(excelData)> 
<cfset colList = ""> 

<cfloop index="col" array="#metadata#"> 
    <cfset colList = listAppend(colList, col.name)> 
</cfloop> 

<cfset buffer=ArrayNew(1)> 
<cfset crlf=chr(13)&chr(10)/> 

<cfoutput query="excelData"> 
    <cfset thisRow = []> 
    <cfloop index="i" list="#colList#"> 
     <cfset ArrayAppend(thisRow,excelData[i][currentRow])> 
    </cfloop> 
    <cfset ArrayAppend(buffer, arrayToList(thisRow,chr(9)))> 
</cfoutput> 

// joining to list on crlf 
<cfset test = arrayToList(buffer, crlf)/> 

<cfscript> 
    FileWrite("#urlPath#\Test_Text.txt", "#test#"); 
</cfscript> 

而僅僅是因爲:(未經測試)

<cfspreadsheet action="read" src="#urlPath#\Roster.xlsx" query="excelData" headerrow="1"> 

<cfscript> 
    metadata = getMetaData(excelData); 
    buffer = []; 
    crlf = chr(13)&chr(10); 

    for (data in excelData) { 
     thisRow = ArrayMap(metadata, function (col,i) { 
      return data[col]; 
     }); 
     ArrayAppend(buffer, arrayToList(thisRow,chr(9))); 
    }  

    test = arrayToList(buffer, crlf); 

    FileWrite("#urlPath#\Test_Text.txt", "#test#"); 
</cfscript> 
+0

還有一個問題,我有一個日期格式的問題。我缺少兩位數年份,而不是2016年1月1日的01/01/16。當我使用列表,我正在做這樣的事情來解決: \t \t \t \t你會在上面的代碼中推薦什麼?接近哪個方法?你還可以再次闡述我的代碼和你的解決方案之間的差異嗎?爲什麼我們在代碼中使用第二個arrayTo List?非常感謝! –

+1

我會在每次迭代中處理colList循環內部的內容。我將一個arrayToList分成兩個,以避免在crlf的兩側都有選項卡。不是那個,就是listAppend,或者根本不使用數組。 –

+0

我用我修正dateFormat()的代碼示例更新了我的問題。謝謝! –