it-swarm.com.de

Wie kann man das Komma und das doppelte Anführungszeichen für die CSV-Datei gleichzeitig umgehen?

Ich schreibe eine Java-App, um Daten von Oracle in die CSV-Datei zu exportieren

Leider kann der Inhalt der Daten ziemlich kompliziert sein. Komma ist immer noch der Deliminator, aber einige Daten in einer Zeile könnten wie folgt aussehen:

IDFNLNALTERKOMMENTAR

123, John, Smith, 39, ich sagte "Hey, ich bin 5'10".

dies ist also eine der Zeichenfolgen in der Spalte comment:

Ich sagte "Hey, ich bin 5'10".

Kein Scherz, ich muss den obigen Kommentar ohne Kompromisse in Excel oder Open Office aus einer von Java generierten CSV-Datei anzeigen und kann natürlich keine andere normale Escape-Situation (d. H. Reguläre doppelte Anführungszeichen und normales Komma in einem Tuple) durcheinander bringen. Ich weiß, dass regulärer Ausdruck mächtig ist, aber wie können wir das Ziel in einer so komplizierten Situation erreichen?

60
Dreamer

Es gibt mehrere Bibliotheken. Hier sind zwei Beispiele:


❐ Apache Commons Lang

Apache Commons Lang enthält eine spezielle Klasse zum Escape- oder Unescape-Zeichenfolgen (CSV, EcmaScript, HTML, Java, Json, XML): org.Apache.commons.lang3.StringEscapeUtils .

  • Escape zu CSV

    String escaped = StringEscapeUtils
        .escapeCsv("I said \"Hey, I am 5'10\".\""); // I said "Hey, I am 5'10"."
    
    System.out.println(escaped); // "I said ""Hey, I am 5'10""."""
    
  • Unescape von CSV

    String unescaped = StringEscapeUtils
        .unescapeCsv("\"I said \"\"Hey, I am 5'10\"\".\"\"\""); // "I said ""Hey, I am 5'10""."""
    
    System.out.println(unescaped); // I said "Hey, I am 5'10"."
    

* Sie können es herunterladen vonhier .


❐ OpenCSV

Wenn Sie OpenCSV verwenden, müssen Sie sich keine Gedanken um Flucht oder Unbild machen, nur um den Inhalt zu schreiben oder zu lesen.

  • Datei schreiben:

    FileOutputStream fos = new FileOutputStream("awesomefile.csv"); 
    OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8");
    CSVWriter writer = new CSVWriter(osw);
    ...
    String[] row = {
        "123", 
        "John", 
        "Smith", 
        "39", 
        "I said \"Hey, I am 5'10\".\""
    };
    writer.writeNext(row);
    ...
    writer.close();
    osw.close();
    os.close();
    
  • Lesedatei:

    FileInputStream fis = new FileInputStream("awesomefile.csv"); 
    InputStreamReader isr = new InputStreamReader(fis, "UTF-8");
    CSVReader reader = new CSVReader(isr);
    
    for (String[] row; (row = reader.readNext()) != null;) {
        System.out.println(Arrays.toString(row));
    }
    
    reader.close();
    isr.close();
    fis.close();
    

* Sie können es herunterladen vonhier .

97
Paul Vargas

Excel muss mit der gleichen Situation umgehen können.

Legen Sie diese Dinge in Excel ab, speichern Sie sie als CSV und untersuchen Sie die Datei mit einem Texteditor. Dann wissen Sie, welche Regeln Excel auf diese Situationen anwendet.

Lassen Sie Java dieselbe Ausgabe erzeugen.

Die von Excel verwendeten Formate werden übrigens veröffentlicht ...

**** Edit 1: **** Hier ist, was Excel tut
**** Edit 2: **** Beachten Sie, dass die fputcsv von php genau dasselbe macht wie Excel, wenn Sie "als Enclosure" verwenden. 

[email protected]
Richard
"This is what I think"

wird in dieses verwandelt:

Email,Fname,Quoted  
[email protected],Richard,"""This is what I think"""
34
Tony Ennis

Vielen Dank an Tony und Paul für das schnelle Feedback, es ist sehr hilfreich. Ich finde tatsächlich eine Lösung durch POJO. Hier ist es:

if (cell_value.indexOf("\"") != -1 || cell_value.indexOf(",") != -1) {
    cell_value = cell_value.replaceAll("\"", "\"\"");
    row.append("\"");
    row.append(cell_value);
    row.append("\"");
} else {
    row.append(cell_value);
}

kurz gesagt, wenn sich innerhalb der Zeichenfolge in der Zelle ein Sonderzeichen wie Komma oder Anführungszeichen befindet, dann entgehen Sie zunächst dem Anführungszeichen ("\""), indem Sie zusätzliche Anführungszeichen (wie "\"\"") hinzufügen, und setzen Sie dann das Ganze in ein Anführungszeichen (wie "\""+theWholeThing+"\"")

13
Dreamer

Sie können sich auch ansehen, wie Python Excel-kompatible csv-Dateien schreibt.

Ich glaube, die Standardeinstellung für Excel ist das Verdoppeln von Anführungszeichen - dh Anführungszeichen " werden als "" geschrieben.

3
Li-aung Yip
"cell one","cell "" two","cell "" ,three"

Speichern Sie diese Datei in der CSV-Datei und sehen Sie sich die Ergebnisse an

Wichtige Notiz

"cell one","cell "" two", "cell "" ,three"

ergibt ein anderes Ergebnis, da nach dem Komma ein Leerzeichen steht, das als "

2
A.Zaben
String stringWithQuates = "\""+ "your,comma,separated,string" + "\"";

dadurch wird das Komma in der CSV-Datei beibehalten

0
Ashiq M