복붙노트

[SQL] OUTFILE로 MySQL의 수출 : CSV 탈출 문자

SQL

OUTFILE로 MySQL의 수출 : CSV 탈출 문자

나는 몇 가지 일반적인 필드 작업 표의 데이터베이스 테이블을했습니다.

id, client_id, project_id, task_id, description, time, date 

이 이상하지만 그것의 요점을 이잖아.

나는 수출은 사용자에게 데이터의 백업을 제공하는 CSV 파일 하룻밤에 해당 테이블에서 실행해야합니다. 또한 일부 사용자 정의 보고서와 매크로 엑셀 파일의 데이터 가져 오기로 사용됩니다.

이 모든 날 PHP로 작업 표를 통해 반복 및 파일에 줄을 인쇄와 함께 작동합니다.

문제는 허용하지 않은 실행하는 데 시간이 걸릴 수 있습니다 큰 데이터베이스입니다. 나는 MySQL의 INTO OUTFILE 명령을 재 작성하고 그래서 좋았어요 실행에 몇 초에 아래로 감소.

문제는 지금은 설명 필드에 등 모든 새로운 라인 문자를 탈출 할 수없는 것입니다. 정말, 사용자는 여기에 캐리지 리턴 / 새 라인을 포함한 잠재적으로 문자 조합을 입력 할 수 있습니다.

이것은 내가 가지고있는 MySQL의 코드 조각입니다 :

SELECT id, 
       client,
       project,
       task,
       REPLACE(REPLACE(ifnull(ts.description,''),'\n',' '),'\r',' ') AS description, 
       time,
       date  
      INTO OUTFILE '/path/to/file.csv'
      FIELDS ESCAPED BY '""'
      TERMINATED BY ',' ENCLOSED BY '"'
      LINES TERMINATED BY '\n'
      FROM ....

그러나...

내가 출력 파일의 소스에서보기를하려고하면, 줄 ​​바꿈은 여전히 ​​때문에 엑셀의 CSV 가져 오기는 모든 멋진 매크로를 중단하고 피벗 테이블은 엑셀 마법사가 만든 파일에 존재합니다.

행동의 최고의 코스에서 어떤 생각?

해결법

  1. ==============================

    1.나는 당신의 문을 같이한다고 생각합니다 :

    나는 당신의 문을 같이한다고 생각합니다 :

    SELECT id, 
       client,
       project,
       task,
       description, 
       time,
       date  
      INTO OUTFILE '/path/to/file.csv'
      FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
      LINES TERMINATED BY '\n'
      FROM ts
    

    주로 필드 ' "옵션을 선택적으로 동봉 BY'" ' "'설명 필드 등의 트릭을 할 것 BY 탈출하고 숫자 (안 문자열이 수치의 포함) Excel에서 숫자로 처리됩니다없이

    또한 호출 시도 :

    SET NAMES utf8;
    

    당신의 OUTFILE을 선택하기 전에, 인라인 문자 인코딩을 받고 그 힘 도움말 (모든 UTF8)

    우리는 당신이 얻을 방법을 알려주세요.

  2. ==============================

    2.여기 여기 일 것입니다 : 시뮬레이션합니다 엑셀 2003 (저장 CSV 형식으로)

    여기 여기 일 것입니다 : 시뮬레이션합니다 엑셀 2003 (저장 CSV 형식으로)

    SELECT 
    REPLACE( IFNULL(notes, ''), '\r\n' , '\n' )   AS notes
    FROM sometables
    INTO OUTFILE '/tmp/test.csv' 
    FIELDS TERMINATED BY ',' ENCLOSED BY '"' ESCAPED BY '"'
    LINES TERMINATED BY '\r\n';
    
  3. ==============================

    3.다음을 시도하면 어떻게됩니까?

    다음을 시도하면 어떻게됩니까?

    대신에 두 번 문을 교체 당신의 시도 :

    REPLACE(IFNULL(ts.description, ''),'\r\n', '\n')
    

    또한, 나는 그것이 LINES 그냥 '\ 연구 \ n'대신 '\ n'을 종료해야한다고 생각

  4. ==============================

    4.사실 확인을 위해 출력 파일을 보지 않고, 내 생각 엔 당신이 FIELDS 가치로 이스케이프 없애 가지고 있다는 것입니다.

    사실 확인을 위해 출력 파일을 보지 않고, 내 생각 엔 당신이 FIELDS 가치로 이스케이프 없애 가지고 있다는 것입니다.

    에 하나의 인용 부호와 동일하므로 귀하의 경우는 아마도, (1)은 하나 개의 문자로 의미;의 MySQL의 필드 BY 아마이 개 당신에 계산되지 않았 음 방식으로 작동하고 ESCAPED (2)는 MySQL은 BY와 가치에 의해 종료 LINES를 종료 필드를 포함, 탈출의 필요를 생각하는 각 문자를 앞에하는 데 사용됩니다. 이것은 컴퓨팅 세계의 대부분에 의미가 있지만, Excel에서 탈출 않는 방법이 아니다.

    난 당신이 성공적으로 (Windows 스타일의 뉴 라인의 경우 두 개의 공백을) 공백 문자 줄 바꿈을 교체하는 것을 당신의 두 배가 작동 교체 생각합니다. 당신이 당신의 데이터 (리터럴이 아닌 필드 분리)에있는 쉼표가있는 경우 그러나, 이러한 엑셀 취급 많은 다른 MySQL을보다 따옴표 앞에되고있다. 그런 경우, 다음 Excel 일인가하는 잘못된 줄 바꿈은 MySQL이 줄 끝으로 의도했던 것을 줄 바꿈 사실이다.

  5. ==============================

    5.아마 도움이되지 않습니다하지만 당신은 그 내용으로 CSV 테이블을 만드는 시도 할 수 :

    아마 도움이되지 않습니다하지만 당신은 그 내용으로 CSV 테이블을 만드는 시도 할 수 :

    DROP TABLE IF EXISTS foo_export;
    CREATE TABLE foo_export LIKE foo;
    ALTER TABLE foo_export ENGINE=CSV;
    INSERT INTO foo_export SELECT id, 
       client,
       project,
       task,
       REPLACE(REPLACE(ifnull(ts.description,''),'\n',' '),'\r',' ') AS description, 
       time,
       date
      FROM ....
    
  6. from https://stackoverflow.com/questions/1119312/mysql-export-into-outfile-csv-escaping-chars by cc-by-sa and MIT license