• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 701
  • Last Modified:

csv files and commas in data fields

I have a csv file that needs to be imported to mysql, and then get locations of photos, and rework them. example looks like this:

"Product1","Red","Small","http://www.abc.com/image1.jpg,http://www.com/image2.jpg,http://www.com/image3.jpg","Available"
"Product2","Blue","Small","http://www.abc.com/image1.jpg,http://www.com/image2.jpg,http://www.com/image3.jpg","Available"
"Product3","Yellow","Small","http://www.abc.com/image1.jpg,http://www.com/image2.jpg,http://www.com/image3.jpg","Available"

I can successfully get the data out, but when i try to get the images, it treats them as separate columns. The code I'm using is like that below. How do I grab all the photo column as one column? All columns are separated by double quotes.
<cfloop file="D:\inetpub\seolot\test\csvdemo.csv" index="index" from="2" to="2"> 
 
<cfquery name="importcsv" datasource="seolot"> 
INSERT INTO csvdemo 
         (
         ProductName,
         Color,
         Size
         ) 
         
         VALUES
         (
         '#ReplaceNoCase(listgetAt('#index#',1, ','),'"','','ALL' )#', 
         '#ReplaceNoCase(listgetAt('#index#',2, ','),'"','','ALL' )#',  
         '#ReplaceNoCase(listgetAt('#index#',3),'"','','ALL' )#' 
         ) 
</cfquery> 
 
<!--- GET LIST OF PHOTOS --->
<cfset PhotoList = listgetAt('#index#',4)>
 
<!--- REMOVE DOUBLE QUOTES --->
<cfset PhotoList = #ReplaceNoCase(Photolist,'"','','ALL' )#>
 
1st photo: #listgetAt('#PhotoList#',1)#<br />
 
<br />
<cfloop list="PhotoList" index="i" delimiters=","> 
<cfset PhotoList = listgetAt('#PhotoList#',#i#, ',')>
 
Photo #i#: #PhotoList#<br />
</cfloop>
   
</cfloop>

Open in new window

0
monosyth
Asked:
monosyth
  • 3
  • 2
2 Solutions
 
ZvonkoSystems architectCommented:
Check this:
<cfloop file="D:\inetpub\seolot\test\csvdemo.csv" index="index" > 
<cfquery name="importcsv" datasource="seolot"> 
  INSERT INTO csvdemo (ProductName, Color, Size ) 
     VALUES (
         '#ReplaceNoCase(listgetAt('#index#',1, ','),'"','','ALL' )#', 
         '#ReplaceNoCase(listgetAt('#index#',2, ','),'"','','ALL' )#',  
         '#ReplaceNoCase(listgetAt('#index#',3),'"','','ALL' )#' 
     ) 
</cfquery>
<!--- GET LIST OF PHOTOS --->
<cfset PhotoList = listgetAt('#index#',7,'"')>
<!--- NO NEED TO REMOVE DOUBLE QUOTES --->
<!--- cfset PhotoList = #ReplaceNoCase(Photolist,'"','','ALL' )# --->
<cfset i=0 >
<cfloop list="#PhotoList#" index="Photo" delimiters=","> 
 <cfset i=i+1 >
 Photo #i#: #Photo#<br />
</cfloop>
</cfloop>

Open in new window

0
 
ZvonkoSystems architectCommented:
Also be aware that you do not need no quote chars nor hash chars inside CF functions:

<cfset PhotoList = listgetAt(index,7,'"') >

0
 
eszaqCommented:
Try this, a little bit more compact:
<cfloop file="D:\inetpub\seolot\test\csvdemo.csv" index="index" from="2" to="2">
<!--- change list qualifiers to pipes "|" using regular expressions --->
 <cfset index = rereplace(i,'#chr(34)#(,#chr(34)#)?','|','all')>

<cfquery name="importcsv" datasource="seolot">
INSERT INTO csvdemo
         (
         ProductName, Color, Size, Images
         )
         
         VALUES
         (
         '#listgetAt(index,1, '|')#',
         '#listgetAt(index,2, '|')#',
         '#listgetAt(index,3, '|')#',
         '#listgetAt(index,4, '|')#',
         )
</cfquery>
0
Hire Technology Freelancers with Gigs

Work with freelancers specializing in everything from database administration to programming, who have proven themselves as experts in their field. Hire the best, collaborate easily, pay securely, and get projects done right.

 
eszaqCommented:
OOOPS, used wrong variable name in my code. Of course it should be:
 <cfset index = rereplace(index,'#chr(34)#(,#chr(34)#)?','|','all')>
0
 
eszaqCommented:
And OF COURSE (dah) i have extra comma at the end of insert query.
0
 
monosythAuthor Commented:
I ended up using a bit of both, and also I used this code below to figure out the null spaces.

<cfscript>
function listFix(list) {
var delim = '|';
var null = "NULL";
var special_char_list = "\,+,*,?,.,[,],^,$,(,),{,},|,-";
var esc_special_char_list = "\\,\+,\*,\?,\.,\[,\],\^,\$,\(,\),\{,\},\|,\-";
var i = "";
 
if(arrayLen(arguments) gt 1) delim = arguments[2];
if(arrayLen(arguments) gt 2) null = arguments[3];
 
if(findnocase(left(list, 1),delim)) list = null & list;
if(findnocase(right(list,1),delim)) list = list & null;
 
i = len(delim) - 1;
while(i GTE 1){
   delim = mid(delim,1,i) & "_Separator_" & mid(delim,i+1,len(delim) - (i));
   i = i - 1;
}
 
delim = ReplaceList(delim, special_char_list, esc_special_char_list);
delim = Replace(delim, "_Separator_", "|", "ALL");
 
list = rereplace(list, "(" & delim & ")(" & delim & ")", "\1" & null & "\2", "ALL");
list = rereplace(list, "(" & delim & ")(" & delim & ")", "\1" & null & "\2", "ALL");
    
return list;
}
</cfscript>
 
<!--- THEN PUT THIS INSIDE YOUR LOOP --->
 <cfset index = listFix(index)>

Open in new window

0

Featured Post

Free Tool: Subnet Calculator

The subnet calculator helps you design networks by taking an IP address and network mask and returning information such as network, broadcast address, and host range.

One of a set of tools we're offering as a way of saying thank you for being a part of the community.

  • 3
  • 2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now