2017-05-09 6 views
1

Ich lade eine CSV und versuche, den Inhalt in MySQL einzufügen. Eines der Felder hat Kommas in ihm, so zum Beispiel:Wie ersetze ich unerwünschte Kommas in einer Datei mit Kommas als Trennzeichen in 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" 

Ich beginne mit in der Datei zu lesen:

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

Dann beginne ich eine Schleife:

<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> 

Mein Problem Hier ist, dass im zweiten Element (John Doe), diese Kommas im 3. Feld als neue Felder aussortiert werden. Also muss ich entweder herausfinden, was ich vermisse, was das verursacht, ODER die Kommas in irgendeinem Feld entfernen und sie durch ein anderes Zeichen ersetzen.

+0

Was versuchen Sie mit den Daten? Tabellenkalkulation oder Datenbank? –

+2

Ich sehe, dass Sie dort intelligente Anführungszeichen haben. Wird Ihre Zeichenfolge smarte Anführungszeichen haben oder ist dies nur ein Beispiel? –

+0

Datenbank, und die intelligenten Anführungszeichen sind nur ein Beispiel. Ich mache mir nur Sorgen um die Kommas zwischen den Zitaten. – mck

Antwort

1

Versuchen Sie, diese Regex mit den eingebetteten Kommas mit Bindestrichen ersetzen:

<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> 

Hier die GIST ist.

Edit:

Dies funktioniert, aber es ist auch dort jede CR/LF Strippen in. Wie ich Schleife durch meine Artikel, ich tue: <cfloop index="index" list="#csvContent#" delimiters="#chr(13)#,#chr(10)#">

Sie können einfach verwenden CR/LF (chr(13)chr(10)) als Trennzeichen. Hier ist ein Beispiel:

<!--- 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

Das funktioniert, aber es entfernt auch jeden CR/LF dort. Während ich meine Artikel durchlaufe, mache ich: mck

+0

Eine Erklärung würde helfen für die Downvote. – Beginner

+0

OK, ich habe die ganze Frage neu formatiert, um das Problem klarer zu machen. Hoffe jemand kann helfen. Danke – mck

2

Verwenden <cfhttp> statt <cffile> die Datei zu lesen. Das Attribut name gibt Ihnen ein Abfrageattribut. This document besagt, dass der Standardwert des textQualifier ein double-Anführungszeichen ist, aber ich würde es trotzdem angeben.

+0

Probieren Sie es einfach aus, und während der DUMP alles perfekt analysiert, bricht es immer noch in der Schleife. Ist das etwas falsch in Ersetzen (listgetAt (index ...? – mck

+0

RE: * Das funktioniert, aber es ist auch strippen alle CR/LF drin * mck - @ Anfänger Beispiel funktionierte gut für mich. Können Sie bitte erstellen Sie eine ausführbare Datei Gibt es ein Problem? http://trycf.com/gist/0510cfa439898f98b3d9b833d7c77bcd/acf2016?theme=monokai – Leigh

+0

Hier, schauen Sie hier und Sie werden sehen, es bricht bei "No Knoblauch", wo es sagen sollte: "Kein Knoblauch, Zwiebeln , oder Nüsse "https://trycf.com/gist/e0c414ef9b5ef90706ee8e136a67ef06/acf2016?theme=monokai – mck

Verwandte Themen