web-dev-qa-db-fra.com

Guillemets non désirés dans le fichier csv généré

J'ai créé un fichier CSV en utilisant le code Java ci-dessous:

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();

Je reçois le fichier CSV, mais son contenu contient des guillemets indésirables.

Par exemple. "ABC", "123", "KDNJ"

Je ne comprends pas où ces guillemets sont ajoutés.

21
Edward

Cela a fonctionné pour moi

CSVWriter writer = 
    new CSVWriter(new FileWriter(csv), ',', CSVWriter.NO_QUOTE_CHARACTER);

Voir le CSVWriter javadoc

40
Shamis Shukoor

Vous devriez probablement clarifier ce que vous entendez par citations «indésirables». 

  1. Je ne veux pas qu'il cite tout, mais uniquement les champs contenant des virgules, des guillemets et des nouvelles lignes (tout est inutile)

  2. Je ne veux rien citer, et je comprends que mon CSV sera invalide s'il contient des virgules, des guillemets et des sauts de ligne incorporés.

Si c'est la première option, opencsv ne le supporte pas - il cite tout ou rien. Jetez un coup d’œil à Super CSV si vous voulez une bibliothèque CSV open source qui cite seulement lorsque cela est nécessaire (et peut citer tout aussi , si nécessaire).

Si c'est la deuxième option, répondez avec la réponse de Sheldon, mais sachez que votre fichier CSV sera invalide s'il contient des virgules, des guillemets et des nouvelles lignes incorporées. 

Par exemple, si je lis votre fichier CSV, comment est-ce que je veux savoir que ce qui suit est en fait juste un enregistrement avec 2 champs?

P Sherman, 42 Wallaby Way,
Sydney, AUSTRALIA

Considérant que, s’il était cité correctement, ce serait évident, c’est-à-dire.

P Sherman, "42 Wallaby Way,
Sydney, AUSTRALIA"

Pour votre information, voici les règles relatives aux citations de RFC4180 (la définition de type MIME pour CSV).

5 Chaque champ peut être ou non mis entre guillemets (toutefois, certains programmes, tels que Microsoft Excel, n'utilisent pas de guillemets Du tout). Si les champs ne sont pas entourés de guillemets doubles, alors les guillemets doubles peuvent ne pas apparaître dans les champs. Par exemple:

   "aaa","bbb","ccc" CRLF
   zzz,yyy,xxx

6 Champs contenant des sauts de ligne (CRLF), des guillemets et des virgules doit être placé entre guillemets. Par exemple:

   "aaa","b CRLF
   bb","ccc" CRLF
   zzz,yyy,xxx

7 Si des guillemets doubles sont utilisés pour entourer des champs, un guillemet double apparaissant à l'intérieur d'un champ doit être échappé en le précédant de une autre double citation. Par exemple:

   "aaa","b""bb","ccc"
12
James Bassett

Si vous ne voulez pas que les guillemets soient dans les valeurs du fichier CSV généré, vous devez créer l'objet CSVWriter de la manière suivante:

CSVWriter writer = new CSVWriter(new FileWriter(filePath),
    CSVWriter.DEFAULT_SEPARATOR,
    CSVWriter.NO_QUOTE_CHARACTER,
    CSVWriter.DEFAULT_ESCAPE_CHARACTER,
    CSVWriter.RFC4180_LINE_END);

La clé est CSVWriter.NO_QUOTE_CHARACTER. Vous pouvez personnaliser les valeurs des autres paramètres du constructeur.

4
giainel

private void writeFile (String fileAbsolutePath, ListcsvLines) lève l'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();
}

Appelez: writeFile (fileAbsolutePath, csvLinesList);

Exemple de travail pour la réponse de Shamis, cela fonctionne très bien pour moi.

1
user989383

Je me trouvais dans une situation où des données étaient affichées dans mon fichier .csv avec trois guillemets de chaque côté. Cela était dû à mes données ayant des citations dans Excel. La seconde que j'ai créé un fichier .csv, je voudrais ouvrir pour voir plus de citations qui était nécessaire. Après beaucoup de recherches sur le net, j'ai trouvé du code et modifié pour me convenir comme suit: - 

 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

Ce code supprimera les citations supplémentaires et laissera les données avec des guillemets simples au début et à la fin des données. J'espère que cela aidera quelqu'un et si j'ai mal agi dans mon format ou si les données ne sont pas affichées correctement, pardonnez-moi. J'essaie juste d'aider les autres. Gardez à l'esprit, ce n'est pas mon code du tout. Je viens de le faire fonctionner pour moi et je soupçonne que d’autres essaient d’obtenir ce que j’ai réalisé ici . Le code original est disponible ici http://www.mcgimpsey.com/Excel/textfiles.html#csvwithquotes

0
Vineshan

Je suis également confronté au même problème avec csv ouvert et pour résoudre le problème que j’utilise avec un caractère échappé.

pour ex:

CSVReader csvReader = new CSVReader(new FileReader(fileName), seprator,escaped_character);

Ici, csv par défaut utilise des guillemets doubles comme escape_character (selon mes connaissances) 

Dans mon cas, j'utilise un séparateur comme signe de tuyau (|)

A2 | G A A | Thilina | 9022V | 1 | 2 | 3 | 4 | "Rubasingha" | 'Abc | MATARA "|' Non '| 2012 | 1668.88

Ici "Rubasingha" ouvrez et fermez les guillemets et dans 'Non' ouvrez et fermez également les guillemets simples. ces deux fonctionnent parfaitement en défaut csv ouvert

mais lorsque nous utilisons 'Abc - ouvre uniquement les guillemets simples - cela fonctionne aussi très bien

mais MATARA " OR " MATARA - nous avons ici une citation double.

pour résoudre le problème, je référence cette page ( http://cs.swan.ac.uk/~csbob/teaching/Java/JavaDemoNetbeans/opencsv-2.3/doc/ )

Il existe des constructeurs qui fournissent votre propre séparateur et des guillemets. Supposons que vous utilisiez un onglet pour votre séparateur, vous pouvez faire quelque chose comme ceci:

CSVReader reader = new CSVReader(new FileReader("yourfile.csv"), '\t');

Et si vous citez simplement vos caractères d'échappement au lieu de les citer en double, vous pouvez utiliser le constructeur à trois arguments:

CSVReader reader = new CSVReader(new FileReader("yourfile.csv"), '\t', '\'');

Vous pouvez également ignorer les premières lignes du fichier si vous savez que le contenu ne commence pas plus tard dans le fichier. Ainsi, par exemple, vous pouvez ignorer les deux premières lignes en faisant:

CSVReader reader = new CSVReader(new FileReader("yourfile.csv"), '\t', '\'', 2);

je change donc le caractère d'échappement par défaut en signe (^) sans utiliser de guillemets comme caractère d'échappement.

CSVReader csvReader = new CSVReader(new FileReader(fileName), '|','^');

C'est la façon dont je résous le problème. Merci

0
Thilina Rubasingha