Как выйти из запятой и двойной кавычки в то же время для файла CSV?

Я пишу приложение Java для экспорта данных от Oracle до файла CSV

К сожалению, содержание данных может довольно хитрый. Все еще запятая является deliminator, но некоторые данные по строке могли быть похожими на это:

ИДЕНТИФИКАТОР FN LN КОММЕНТАРИЙ ВОЗРАСТА

123, John, Smith, 39 лет, я сказал "Эй, я 5'10"."

таким образом, это - одна из строки на comment столбец:

Я сказал "Эй, я 5'10"."

Никакое ребячество, я должен показать выше комментария без компромисса в Excel или открытом офисе из файла CSV, сгенерированного Java, и конечно не могу испортить другую регулярную ситуацию с выходом (т.е. регулярные двойные кавычки и регулярную запятую в кортеже). Я знаю, что регулярное выражение мощно, но как мы можем достигнуть цели с такой сложной ситуацией?

62
задан 16 March 2015 в 16:31

7 ответов

Существует несколько библиотек. Вот два примера:

<час>

❐ Apache Lang Commons Lang

Apache Commons включает специальный класс, чтобы выйти или не выйти из строк (CSV, EcmaScript, HTML, Java, Json, XML): org.apache.commons.lang3.StringEscapeUtils .

  • Escape к НеEscape 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""."""
    
  • от 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"."
    

* можно загрузить его от [1 114] здесь .

<час>

❐ OpenCSV

, Если Вы используете OpenCSV, Вы не должны будете волноваться о Escape или неEscape, только для записи или считать содержание.

  • файл Записи:

    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();
    
  • файл Чтения:

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

* можно загрузить его от [1 115] здесь .

105
ответ дан 31 October 2019 в 13:27

Excel должен смочь обработать ту же самую ситуацию.

Помещенный те вещи в Excel, сохраните их как CSV и исследуйте файл с текстовым редактором. Затем Вы будете знать правила, Excel относится к этим ситуациям.

Заставляют Java произвести тот же вывод.

форматы, используемые Excel, публикуются, между прочим...

Редактирование **** 1: **** Здесь - то, что Excel делает
Редактирование **** 2: Примечание ****, что php's fputcsv делает ту же точную вещь как Excel, если Вы используете "в качестве корпуса.

rdeslonde@mydomain.com
Richard
"This is what I think"

преобразовывается в это:

Email,Fname,Quoted  
rdeslonde@mydomain.com,Richard,"""This is what I think"""
34
ответ дан 31 October 2019 в 13:27

И благодаря Tony и благодаря Paul для быстрой обратной связи, его очень полезного. Я на самом деле выясняю решение через POJO.Вот:

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

короче говоря, если существует специальный символ как запятая или двойная кавычка в строке в стороне ячейка, то сначала выходят из двойной кавычки ("\"") путем добавления дополнительной двойной кавычки (как "\"\""), то помещенный все это в двойную кавычку (как "\""+theWholeThing+"\"")

14
ответ дан 31 October 2019 в 13:27

Вы могли также посмотреть на то, как Python пишет совместимый с Excel csv файлы.

я полагаю, что значение по умолчанию для Excel должно удвоиться для литеральных символов кавычки - то есть, литеральные кавычки " записаны как "".

3
ответ дан 31 October 2019 в 13:27
"cell one","cell "" two","cell "" ,three"

Сохраняют это к файлу CSV и видят результаты, таким образом, двойная кавычка используется для выхода из себя

, Важное Примечание

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

даст Вам другой результат, потому что существует пространство после запятой, и это будут рассматривать как"

2
ответ дан 31 October 2019 в 13:27

Если Вы используете CSVWriter. Проверьте, что у Вас нет опции

.withQuotechar(CSVWriter.NO_QUOTE_CHARACTER)

, Когда я удалил ее, запятая показывала как ожидалось и не рассматривала ее как новый столбец

1
ответ дан 31 October 2019 в 13:27
String stringWithQuates = "\""+ "your,comma,separated,string" + "\"";

это сохранит запятую в файле CSV

0
ответ дан 31 October 2019 в 13:27

Другие вопросы по тегам:

Похожие вопросы: