Создание CSV-файла на java, какой карачтер строки я должен заменить для правильного вывода CSV?

Перед написанием этого я искал любую документацию, которая скажет мне, какие символы повредят окончательный csv, который генерируется из java. Я не нашел ничего хорошего и полного. Я делаю метод в моем коде, чтобы заменить все возможные минимальные символы из строки перед созданием csv:

    public static String getPureNote(String dirtyNote) {
    StringBuffer s = new StringBuffer();

    for (int i = 0; i < dirtyNote.length(); i++) {
        char c = dirtyNote.charAt(i);
        if (c == 'n') {//new line make a new line in my csv and i want just to stay in a single cell
            s.append(" ");
        } else if (c == 'r') {
            s.append(" ");
        } else if (c == 't') {//make a huge tab 
            s.append(" ");
        } else if (c == ';') {//the input continue in a adjacent cell and don't stay in a single one
            s.append(",");
        } else {
            s.append(c);
        }
    }

    return s.toString();

}

Пример строки и CSV выглядят как:

 ok (implementing the method getPureNote):
 Com  Code  Desc   Struct   Note
 62   001   first  1         first structure on  
 63   002   second 2         second structure off
 ko (if after structure on note is /n character and not implementing the        method): 
 Com   Code  Desc   Struct  Note
 62   001   first  1         first structure 
 on  
 63   002   second 2         second structure 
 off

Этот метод в порядке сейчас, но я хочу знать, какие символы я должен заменить/удалить всегда из строки перед созданием csv-файла? Я не могу проверить все возможные символы, которые повредят мой csv-файл. Конечные пользователи откроют его двойным щелчком и не импортируют в Excel.
Спасибо!

1 ответ

  1. Вы пропускаете кавычки (т. е. "). Вы, вероятно, можете заменить их одиночными кавычками (т. е. ').

    Однако если ваше значение уже содержит разделитель (т. е. запятую:,), вам придется заключить все значение в кавычки в конце.

    Глядя на ваш код, вы должны сделать это:

    boolean wrapInQuotes = false;
    int recordStart = 0;
    for (int i = 0; i < dirtyNote.length(); i++) {
        char c = dirtyNote.charAt(i);
        ... // your original code here
        } else if (c == ',') { //value contains comma, we need to put it in quotes.
            s.append(c);
            wrapInQuotes = true;
        } else if (c == ';') { //looks like you want to create a new record
            if(wrapInQuotes){
                s.insert(recordStart, '"'); //puts a quote before the field
                s.append('"'); //puts the closing quote after the field
            }
            s.append(",");
            recordStart = s.length();
            wrapInQuotes = false; //starts over
        } else if (c == '"') {
            s.append('\''); //replace double quotes by single quotes.
        } else {
            s.append(c);
        }
    
        if(wrapInQuotes){
            s.insert(recordStart, '"'); //puts a quote before the field
            s.append('"'); //puts the closing quote after the field
        }
    }
    

    Я на самом деле не тестировал это, но это должно сделать трюк. Как вы можете видеть, обработка CSV не совсем проста. Если все становится слишком сложно или медленно, возможно, попробуйте использовать библиотеку CSV, такую как univivity-parsers, чтобы сделать эту работу за вас (я, кстати, автор этой библиотеки).

    Надеюсь, это поможет