我有一个制表符分隔文本文件,其中包含可怕的“NULL”值。经过一些搜索,我发现如何用“东西”替换空字符串......但是当我这样做时,我似乎失去了一半的价值观。
<cfset thisRow = replace(thisRow, "#chr(9)##chr(9)#", "#chr(9)#ScoobySnack#chr(9)#", "all")>
例如:一行数据包含120个“空标签” - 但是当我执行此解决方法时 - 我只返回60. Snippet在这里:
<cffile action="read" file="c:\websites\the website\UsageData\#MyFile.NAME#" variable="myDataFile">
<cfset rowCount = listLen(myDataFile,chr(13))>
-Other stuff happens-
<cfloop from="1" to="#rowCount#" index="i">
<table cellpadding="2" cellspacing="0" border="1">
<tr>
<th>ID</th>
<th>Date</th>
<th>Time</th>
<th>DeviceMac</th>
<th>DeviceAddress</th>
<th>DeviceName</th>
<th>UsageBytes</th>
</tr>
<!--- set current row to simple variable --->
<cfset thisRow = listGetAt(myDataFile,i,chr(13))>
<cfset Field1 = listGetAt(thisRow,1,chr(9))>
<cfset Field2 = listGetAt(thisRow,2,chr(9))>
<cfset Field3 = listGetAt(thisRow,3,chr(9))>
<cfset thisRow = replace(thisRow, "#chr(9)##chr(9)#", "#chr(9)#ScoobySnack#chr(9)#", "all")>
<cfset variables.CheckColumnCount = listLen(thisRow,chr(9))>
<cfif variables.CheckColumnCount NEQ variables.ColumnCount>
<cfset variables.AdjustedColumnCount = (variables.CheckColumnCount - 3)>
<cfelse>
<cfset variables.AdjustedColumnCount = (variables.ColumnCount - 3)>
</cfif>
<!---Row #i# Data as a string (#thisRow#)<br/>--->
<cfset ColNum = 4>
<!--- now loop the row --->
<cfloop from="1" to="#variables.AdjustedColumnCount#" index="r">
<cfif r EQ 1>
<cfset variables.MyLoopStartTime = variables.MyStartTime>
<cfelse>
</cfif>
<tr>
<td>#ColNum#</td>
<td>#variables.thisDate#</td>
<td>#TimeFormat(variables.MyLoopStartTime,"hh:mm:ss")#</td>
<td>#Field1#</td>
<td>#Field2#</td>
<td>#Field3#</td>
<td>#listGetAt(thisRow,ColNum,chr(9))#</td>
</tr>
<cfset variables.MyLoopStartTime = DateAdd('n', 1, variables.MyLoopStartTime)>
<cfset ColNum = ColNum +1>
</cfloop>
</table>
<hr>
<cfset count = count + 1>
</cfloop>
思考?
答案 0 :(得分:1)
(来自评论..)
有better tools for the job:专为解析分隔文件而设计的listToArray()。但是,要回答您的问题,如果您必须自己动手,请不要使用replace()
。使用数组更简单,特别是{{3}}和includeEmptyFields=true
。
读入文件,并在CR上拆分内容以创建行数组:
<!--- split content into an array of rows --->
<cfset rowArray = listToArray(myDataFile, chr(13), true)>
<cfset rowCount = arrayLen(rowArray)>
然后遍历数组,并从每行创建一个单独的列数组:
<cfloop from="1" to="#rowCount#" index="rowIndex">
<!--- split current row into an array of columns --->
<cfset thisRow = rowArray[ rowIndex ]>
<cfset colArray = listToArray(thisRow , chr(9), true)>
<!--- get first 3 columns (for illustration) --->
<cfset Field1 = colArray[ 1 ]>
<cfset Field2 = colArray[ 2 ]>
<cfset Field3 = colArray[ 3 ])>
...
</cfloop>
如果你不需要其他东西的循环索引,你也可以使用数组循环:
<!--- split content into an array of rows --->
<cfset rowArray = listToArray(myDataFile, chr(13), true)>
<cfloop array="#rowArray#" index="thisRow">
<!--- split current row into an array of columns --->
<cfset columns = listToArray(thisRow, chr(9), true)>
<!--- get first N columns for illustration --->
<cfset Field1 = columns [ 1 ]>
<cfset Field2 = columns [ 2 ]>
<cfset Field3 = columns [ 3 ])>
...
</cfloop>