[java] Excel에서 작동하도록 CSV 파일의 쉼표와 음성 표시를 어떻게 이스케이프해야합니까?

탭이 아닌 쉼표로 구분 된 CSV 파일을 생성하고 있습니다. 내 사용자는 CSV 파일을 두 번 클릭하여 Excel에서 열 가능성이 높습니다. 내 데이터에는 쉼표와 음성 표시가 포함될 수 있으므로 다음과 같이 이스케이프합니다.

Reference, Title, Description
1, "My little title", "My description, which may contain ""speech marks"" and commas."
2, "My other little title", "My other description, which may also contain ""speech marks"" and commas."

내가 아는 한 항상 그렇게하는 방법이었습니다. 여기 내 보글이 있습니다. Excel 2010에서이 파일을 열면 이스케이프가 존중되지 않습니다. 시트에 음성 표시가 나타나고 쉼표는 새 열을 생성합니다.



답변

우리는 결국 이것에 대한 답을 찾았습니다.

Excel은 열 값 앞에 공백이없는 경우에만 쉼표와 음성 표시의 이스케이프를 고려합니다. 이렇게 공백없이 파일을 생성하는 중 …

Reference,Title,Description
1,"My little title","My description, which may contain ""speech marks"" and commas."
2,"My other little title","My other description, which may also contain ""speech marks"" and commas."

… 문제가 해결되었습니다. 이것이 누군가를 돕기를 바랍니다!


답변

다음은 무작위라고 생각하는 경우의 규칙입니다. 이러한 규칙을 기반으로 유틸리티 함수를 만들 수 있습니다.

  1. 값에 쉼표, 줄 바꿈 또는 큰 따옴표가 포함 된 경우 문자열 값은 큰 따옴표로 묶여 반환되어야합니다.

  2. 값의 큰 따옴표 문자는 다른 큰 따옴표로 이스케이프해야합니다.

  3. 값에 쉼표, 줄 바꿈 또는 큰 따옴표가 포함되어 있지 않으면 문자열 값이 변경되지 않고 반환되어야합니다.


답변

Yashu의 지시에 따라 다음 함수를 작성했습니다 (PL / SQL 코드이지만 다른 언어에 쉽게 적용 할 수 있어야 함).

FUNCTION field(str IN VARCHAR2) RETURN VARCHAR2 IS
    C_NEWLINE CONSTANT CHAR(1) := '
'; -- newline is intentional

    v_aux VARCHAR2(32000);
    v_has_double_quotes BOOLEAN;
    v_has_comma BOOLEAN;
    v_has_newline BOOLEAN;
BEGIN
    v_has_double_quotes := instr(str, '"') > 0;
    v_has_comma := instr(str,',') > 0;
    v_has_newline := instr(str, C_NEWLINE) > 0;

    IF v_has_double_quotes OR v_has_comma OR v_has_newline THEN
        IF v_has_double_quotes THEN
            v_aux := replace(str,'"','""');
        ELSE
            v_aux := str;
        END IF;
        return '"'||v_aux||'"';
    ELSE
        return str;
    END IF;
END;


답변

작은 따옴표도 큰 따옴표를 이스케이프하지 않아도 잘 작동합니다. 최소한 Excel 2016에서는 다음과 같습니다.

'text with spaces, and a comma','more text with spaces','spaces and "quoted text" and more spaces','nospaces','NOSPACES1234'

Excel은이를 5 개의 열에 넣습니다 ( “Text to columns”마법사에서 “Text qualifier”로 작은 따옴표를 선택한 경우)


답변

큰 따옴표 후에도 며칠 동안이 문제가 발생했습니다.

Pipe Delimiter를 쉼표로 바꾸면 문제가 해결되었습니다.


답변