As another alternative method, I have used the following function in the past to parse csv style strings. I tested it against your sample file and it seemed to work OK:
<cffunction name="csvToArray" access="public" output="false" returntype="array" hint="Transforms a .CSV file to an array.">
<cfargument name="csvString" type="string" default="" required="true">
<cfargument name="itemDelim" type="string" default="," required="false">
<cfargument name="rowDelim" type="string" default="#chr(13) & chr(10)#" required="false">
<cfargument name="escapeChar" type="string" default="""" required="false">
<cfargument name="escapedEscapeChar" type="string" default="""""" required="false">
<cfscript>
var currentVal = ""; // string containing the value currently being parsed
var inEscapedCell = false; // set to true when we are parsing an escaped cell value
var i = 1;
var currentChar = "";
var rowDelimCheck = "";
var escapeDelimCheck = "";
var escapedEscapeCheck = "";
var aDataSet = arrayNew(1);
var aRowSet = arrayNew(1);
// we parse our string a character at a time
for(i=1; i LTE len(arguments.csvString); i=i+1){
currentChar = mid(arguments.csvString, i, 1);
rowDelimCheck = mid(arguments.csvString, i, len(arguments.rowDelim));
escapeDelimCheck = mid(arguments.csvString, i, len(arguments.escapeChar));
escapedEscapeCheck = mid(arguments.csvString, i, len(arguments.escapedEscapeChar));
// are we in an escaped cell???
if(inEscapedCell){
// we are in an escaped cell, we need to check for our ending escape character
if((NOT escapeDelimCheck IS arguments.escapeChar) OR (escapedEscapeCheck IS arguments.escapedEscapeChar)){
if(escapedEscapeCheck IS arguments.escapedEscapeChar){
currentVal = currentVal & arguments.escapeChar; // log our character
i = i + len(arguments.escapedEscapeChar) - 1;
}else{
currentVal = currentVal & currentChar; // log our character
}
}else{
i = i + len(arguments.escapeChar) - 1;
inEscapedCell = false; // break from our escaped cell
}
}else{
// are we at the end of our cell???
if((currentChar IS arguments.itemDelim) OR (rowDelimCheck IS arguments.rowDelim)){
arrayAppend(aRowSet, currentVal);// commit our current value
currentVal = ""; // get ready for our next value
if(rowDelimCheck IS arguments.rowDelim){
arrayAppend(aDataSet, duplicate(aRowSet));// commit our current row
aRowSet = arrayNew(1); // get ready for our next row
i = i + len(arguments.rowDelim) - 1;
}
}else{
if(escapeDelimCheck IS arguments.escapeChar){
i = i + len(arguments.escapeChar) - 1;
inEscapedCell = true; // open our escaped cell clause
}else{
currentVal = currentVal & currentChar; // log our character
}
}
}
}
return aDataSet;
</cfscript>
</cffunction>
<cfset csv = fileRead(expandPath("./sample.csv"))>
<cfset parsed = csvToArray(csv, "|", chr(10))>
<cfdump var="#parsed#">