2017-05-09 6 views
1

Je charge un fichier CSV et j'essaie d'insérer le contenu dans MySQL. L'un des champs a virgules, donc par exemple:Comment remplacer les virgules non désirées dans un fichier délimité par des virgules dans ColdFusion

"Jane Doe","Boston","None","Yes","No" 
"John Doe","New York","No garlic, onions, or nuts","Yes","No" 
"Mary Doe","New York","None","Yes","No" 

Je commence par la lecture dans le fichier:

<cffile action="read"file="/var/www/html/temp.csv" variable="datacsv"> 

je commence une boucle:

<cfloop index="index" list="#datacsv#" delimiters="#chr(13)#,#chr(10)#"> 
    <cfset item1 = Replace(listgetAt(index,1), """", "", "ALL")> #item1#<br> 
    <cfset item2 = Replace(listgetAt(index,2), """", "", "ALL")> #item2#<br> 
    <cfset item3 = Replace(listgetAt(index,3), """", "", "ALL")> #item3#<br> 
    <cfset item4 = Replace(listgetAt(index,4), """", "", "ALL")> #item4#<br> 
    <cfset item5 = Replace(listgetAt(index,5), """", "", "ALL")> #item5#<br> 
</cfloop> 

Mon problème voici que dans le deuxième article (John Doe), ces virgules dans le troisième champ sont éliminés comme de nouveaux champs. Donc, soit j'ai besoin de comprendre ce qui me manque qui cause cela, soit de supprimer les virgules dans n'importe quel champ et de les remplacer par un caractère différent.

+0

Qu'est-ce que vous essayez de faire avec les données? Tableur ou base de données? –

+2

Je vois que vous avez des citations intelligentes là-dedans. Est-ce que votre chaîne aura des citations intelligentes ou est-ce juste un exemple? –

+0

Base de données, et les citations intelligentes ne sont que des exemples. Tout ce qui m'inquiète, ce sont les virgules entre les citations. – mck

Répondre

1

Essayez d'utiliser cette regex pour remplacer les virgules intégrées avec des tirets:

<cfscript> 

    // CSV content 
    csvContent = '"John Doe","New York","No garlic, onions, or nuts","Yes","No"'; 

    // Replace all comma in between with dash 
    writeOutput(
     csvContent.replaceAll(
      ',(?!")|(?<!"),(?=[^"]*?"(?:,|\r?\n|\r|$))', '-' 
     ) 
    ); 
</cfscript> 

Voici le GIST.

Edit:

Cela fonctionne, mais il se déshabille aussi toute CR/LF là-dedans. En boucle I à mes articles, je fais: <cfloop index="index" list="#csvContent#" delimiters="#chr(13)#,#chr(10)#">

Vous pouvez simplement utiliser CR/LF (chr(13)chr(10)) comme séparateur. est un exemple:

<!--- CSV content ---> 
<cfset csvContent = '"John Doe","New York","No garlic, onions, or nuts","Yes","No"'> 

<!--- Replace all comma in between with dash ---> 
<cfset newCsvContent = csvContent.replaceAll(
    ',(?!")|(?<!"),(?=[^"]*?"(?:,|\r?\n|\r|$))', '-' 
)> 

<!--- Process records ---> 
<cfoutput> 
    <cfloop list="#newCsvContent#" index="csvRow" delimiters="#chr(13)##chr(10)#"> 
     Column 1: #replace(csvRow.listGetAt(1), """", "", "ALL")#<br> 
     Column 2: #replace(csvRow.listGetAt(2), """", "", "ALL")#<br> 
     Column 3: #replace(csvRow.listGetAt(3), """", "", "ALL")#<br> 
     Column 4: #replace(csvRow.listGetAt(4), """", "", "ALL")#<br> 
     Column 5: #replace(csvRow.listGetAt(5), """", "", "ALL")#<br> 
     <br> 
    </cfloop> 
</cfoutput> 
+0

Cela fonctionne, mais il supprime également tout CR/LF là-bas. Comme je boucle à travers mes articles, je fais: mck

+0

Une explication aiderait à la downvote. – Beginner

+0

OK, je viens de reformater toute la question pour rendre le problème plus clair. J'espère que quelqu'un peut aider. Merci – mck

2

Utilisation <cfhttp> au lieu de <cffile> pour lire le fichier. L'attribut name vous donne un attribut de requête. indique que la valeur par défaut du textQualifier est un guillemet double, mais je le spécifierais de toute façon.

+0

Juste essayé, et tandis que le DUMP analyse tout parfaitement, il est toujours en rupture dans la boucle. Est-ce que quelque chose ne va pas dans Remplacer (listgetAt (index ...? – mck

+0

RE: * Cela fonctionne, mais il est également dépouillant tout CR/LF là-bas * mck - @ L'exemple de débutant a bien fonctionné pour moi.Pouvez-vous s'il vous plaît créer un runnable GIST qui reproduit ce problème? http://trycf.com/gist/0510cfa439898f98b3d9b833d7c77bcd/acf2016?theme=monokai – Leigh

+0

Ici, jetez un oeil ici et vous verrez qu'il se casse à "No Garlic" où il devrait dire "Pas d'ail, oignons , ou écrous "https://trycf.com/gist/e0c414ef9b5ef90706ee8e136a67ef06/acf2016?theme=monokai – mck