java - quitar - replace comillas asp
Comillas dobles no deseadas en el archivo csv generado (6)
He creado un archivo CSV usando el siguiente código Java:
String csv = rs.getString("UPLOAD_FOLDER_PATH")+".csv";
CSVWriter writer = new CSVWriter(new FileWriter(csv));
String [] filevalues = new String[filevaluesarray.size()];
filevalues=filevaluesarray.toArray(filevalues);
writer.writeNext(filevalues);
writer.close();
Estoy obteniendo el archivo CSV, pero el contenido del archivo tiene comillas dobles no deseadas.
P.ej. "ABC", "123", "KDNJ"
No entiendo de dónde se agregan estas comillas dobles.
Esto funciono para mi
CSVWriter writer =
new CSVWriter(new FileWriter(csv), '','', CSVWriter.NO_QUOTE_CHARACTER);
Ver el javadoc CSVWriter
Probablemente debería aclarar lo que quiere decir con citas "no deseadas".
No quiero que cite todo , solo los campos que contienen comas incrustadas, comillas y nuevas líneas (citar todo es innecesario y hace que mis archivos sean más grandes), o
No quiero que se cite nada y entiendo que mi CSV no será válido si contiene comas, comillas y nuevas líneas incrustadas
Si es la primera opción, entonces opencsv no es compatible con esto, o bien cita todo o nada. Eche un vistazo a Super CSV si desea una biblioteca de código abierto de CSV que solo cite cuando sea necesario (y puede citar todo , si es necesario).
Si es la segunda opción, vaya con la respuesta de Sheldon, pero tenga en cuenta que su CSV no será válido si contiene comas, comillas y nuevas líneas incrustadas.
Por ejemplo, si estoy leyendo su archivo CSV, ¿cómo debo saber que lo siguiente es en realidad solo un registro con 2 campos?
P Sherman, 42 Wallaby Way,
Sydney, AUSTRALIA
Considerando que si se cita correctamente eso sería obvio, es decir
P Sherman, "42 Wallaby Way,
Sydney, AUSTRALIA"
Para su información, aquí están las reglas relacionadas con las citas de RFC4180 (la definición de tipo MIME para CSV).
5 Cada campo puede o no incluirse entre comillas dobles (sin embargo, algunos programas, como Microsoft Excel, no usan comillas dobles). Si los campos no están encerrados entre comillas dobles, entonces las comillas dobles pueden no aparecer dentro de los campos. Por ejemplo:
"aaa","bbb","ccc" CRLF zzz,yyy,xxx
6 Los campos que contienen saltos de línea (CRLF), comillas dobles y comas deben incluirse entre comillas dobles. Por ejemplo:
"aaa","b CRLF bb","ccc" CRLF zzz,yyy,xxx
7 Si se utilizan comillas dobles para encerrar los campos, entonces una comilla doble que aparece dentro de un campo debe escaparse precediéndolo con otra comilla doble. Por ejemplo:
"aaa","b""bb","ccc"
Si no desea las comillas en los valores del archivo CSV generado, debe crear el objeto CSVWriter de esta manera:
CSVWriter writer = new CSVWriter(new FileWriter(filePath),
CSVWriter.DEFAULT_SEPARATOR,
CSVWriter.NO_QUOTE_CHARACTER,
CSVWriter.DEFAULT_ESCAPE_CHARACTER,
CSVWriter.RFC4180_LINE_END);
La clave es CSVWriter.NO_QUOTE_CHARACTER
. Puede personalizar los valores de los otros parámetros del constructor.
También me enfrento con el mismo problema con csv abierto y para solucionar el problema utilizo el carácter de escape.
por ej.
CSVReader csvReader = new CSVReader(new FileReader(fileName), seprator,escaped_character);
Aquí, abierto csv por defecto, use comillas dobles como escape_character (según mi conocimiento)
En mi caso utilizo separador como señal de tubería (|)
A2 | GAA | Thilina | 9022V | 1 | 2 | 3 | 4 | "Rubasingha" | ''Abc | MATARA "|'' No ''| 2012 | 1668.88
Aquí, "Rubasingha" abre y cierra las comillas dobles y en ''No'' también abre y cierra las comillas simples. estos dos funcionan perfectamente en csv abierto por defecto
pero cuando usamos ''Abc - solo comillas simples abiertas - esto también funciona bien
pero MATARA " O " MATARA - aquí tenemos una comilla doble - en mi caso, esto genera un error al leer el CSV usando csv abierto
Para solucionar el problema, hago referencia a esta página ( http://cs.swan.ac.uk/~csbob/teaching/java/JavaDemoNetbeans/opencsv-2.3/doc/ )
Hay constructores que se ocupan de suministrar su propio separador y citar caracteres. Digamos que estás usando una pestaña para tu separador, puedes hacer algo como esto:
CSVReader reader = new CSVReader(new FileReader("yourfile.csv"), ''/t'');
Y si solo citó sus caracteres escapados en lugar de comérselos, puede usar el constructor de tres argumentos:
CSVReader reader = new CSVReader(new FileReader("yourfile.csv"), ''/t'', ''/''');
También puede omitir las primeras líneas del archivo si sabe que el contenido no comienza hasta más tarde en el archivo. Entonces, por ejemplo, puedes saltarte las dos primeras líneas haciendo:
CSVReader reader = new CSVReader(new FileReader("yourfile.csv"), ''/t'', ''/''', 2);
así que cambio mi carácter de escape predeterminado a signo (^) sin usar comillas dobles como carácter de escape.
CSVReader csvReader = new CSVReader(new FileReader(fileName), ''|'',''^'');
Así es como soluciono el problema. Gracias
Tuve una situación en la que me enfrentaba a los datos que se muestran en mi archivo .csv con tres citas en cada lado. Esto se debió a que mis datos tenían citas en Excel. El segundo que creé un archivo .csv, abriría para ver más citas que se requerían. Después de mucho buscar en la red, encontré un código y lo modifiqué para que me quede como sigue:
Public Sub OutputQuotedCSV()
Const QSTR As String = ""
Dim myRecord As Range
Dim myField As Range
Dim nFileNum As Long
Dim sOut As String
nFileNum = FreeFile
Open "TheNameOfYourFile.txt" For Output As #nFileNum
For Each myRecord In Range("A1:A" & _
Range("A" & Rows.Count).End(xlUp).Row)
With myRecord
For Each myField In Range(.Cells(1), _
Cells(.Row, 256).End(xlToLeft))
''I didn''t want my Header Row touched but wanted it added into the csv file
''There''s probably an easier way but this worked perfectly for me
If myField.Text = "HEADER 1" Then
sOut = sOut & QSTR & _
Replace(myField.Text, QSTR, QSTR & QSTR) & " "
ElseIf myField.Text = "HEADER 2" Then
sOut = sOut & QSTR & _
Replace(myField.Text, QSTR, QSTR & QSTR) & " "
ElseIf myField.Text = "HEADER 3" Then
sOut = sOut & QSTR & _
Replace(myField.Text, QSTR, QSTR & QSTR) & " "
ElseIf myField.Text = "HEADER 4" Then
sOut = sOut & QSTR & _
Replace(myField.Text, QSTR, QSTR & QSTR) & " "
ElseIf myField.Text = "HEADER 5" Then
sOut = sOut & QSTR & _
Replace(myField.Text, QSTR, QSTR & QSTR) & " "
ElseIf myField.Text = "HEADER 6" Then
sOut = sOut & QSTR & _
Replace(myField.Text, QSTR, QSTR & QSTR) & " "
Else
''I didn''t want my first column to start with "," so I added the code below
If myField.Cells.Column = 1 Then
sOut = sOut & QSTR & _
Replace(myField.Text, QSTR, QSTR & QSTR) & QSTR
Else
sOut = sOut & "," & QSTR & _
Replace(myField.Text, QSTR, QSTR & QSTR) & QSTR
End If
End If
Next myField
Print #nFileNum, Mid(sOut, 1)
sOut = Empty
End With
Next myRecord
Close #nFileNum
End Sub
Este código eliminará las citas adicionales y dejará los datos con comillas simples al principio y al final de los datos. Espero que esto ayude a alguien y si he hecho algo mal en mi formato o no he mostrado los datos correctamente, perdóneme. Solo estoy tratando de ayudar a los demás. Tenga en cuenta, este no es mi código en absoluto. Acabo de hacer que funcione para mí y sospecho que otros están tratando de obtener lo que logré aquí. El código original se puede encontrar aquí http://www.mcgimpsey.com/excel/textfiles.html#csvwithquotes
private void writeFile (String fileAbsolutePath, ListcsvLines) lanza IOException {
final char csvDelimeter = '','';
CSVWriter csvWriter = new CSVWriter(new FileWriter(new File(fileAbsolutePath)),csvDelimeter,CSVWriter
.NO_QUOTE_CHARACTER);
CSVParser parser = new CSVParser();
for(String csvLine : csvLines){
String[] csvVals = parser.parseLine(csvLine);
csvWriter.writeNext(csvVals);
}
csvWriter.flush();
}
Llame a: writeFile (fileAbsolutePath, csvLinesList);
Ejemplo de trabajo para la respuesta de Shamis, Funciona bien para mí.