2014-01-23 2 views
0

내 CSV의 회선이 어떻게 종료되는지 식별하는 데 문제가 있습니다. 다음 PHP 코드를 사용하여 CSV에서 내 DB로 데이터를로드합니다. 내가 LINES TERMINATED BY "///" 사용할 때PHP에서 업로드 된 CSV를 PHP에서 MySQL 테이블로 가져올 때 LINES TERMINATED BY를 수정했습니다.

mysql_query('LOAD DATA LOCAL INFILE "temp/test.csv" 
      INTO TABLE test 
      FIELDS TERMINATED BY "," 
      LINES TERMINATED BY "///" 
      IGNORE 1 LINES (one, two, three, four, five)'); 

지금, 데이터는 각 행의 첫번째 열은 셀 데이터 다음에 "반환"는 사실을 제외하고, 제대로 내 DB에 투입된다. 그게 내가 원하는 것이 아니에요, 나는 돌아가기를 원합니다.

CSV의 마지막 열 셀 ///의 복귀와 첫 번째 열 셀의 순서가 ///으로 나뉘며 /// + return으로 분할되어야한다고 생각합니다. LINES TERMINATED BY을 변경해야합니다. 나는 \n, \r, \r\n, \n\r을 시도했다. 얼마 후 나는 <br>을 시도했고 도움이 필요하다는 것을 알았습니다.

저는 Mac에서 MS Office를 사용하고 있으며 내 CSV를 Comma Separated Values (.csv) (sample)으로 저장하고 있습니다. 또한 LINES TERMINATED BYMS-DOS Comma SeparatedWindows Comma Separated 개의 파일을 사용해 보았습니다. 내 쿼리를 실행 한 후 SELECT HEX(one) FROM test

결과 :

Array 
(
    [0] => 0D6131 
) 
Array 
(
    [0] => 0D6132 
) 
Array 
(
    [0] => 0D6133 
) 
+1

'0D'는 캐리지 리턴 ('\ r')입니다. (그리고'61'은'A','30'-'39'는 숫자'0'-'9'입니다.)'LINES TERMINATED BY "/// \ r"로 쿼리를 사용하면, 내 MySQL 5.1.49에서 CSV를 사용하자. – Palec

답변

3

올바른 쿼리

귀하의 CSV 세 슬래시 및 캐리지 리턴으로 구분 행이 있습니다. 쿼리에 LINES TERMINATED BY "///\r"을 사용하면 올바르게 작동합니다. 최소한 내 MySQL 5.1.49에서 작동한다.

LOAD DATA LOCAL INFILE "temp/test.csv" 
INTO TABLE test 
FIELDS TERMINATED BY "," 
LINES TERMINATED BY "///\r" 
IGNORE 1 LINES (one, two, three, four, five) 

디버깅 인쇄 할 수없는 문자

인쇄 할 수없는 문자가 무엇인지에 대한 의심, 당신은 항상 16 진 덤프을보고 수동으로 문자를 디코딩 할 수있다. 보통 이러한 문자는 ASCII입니다. * NIXes에 대해서는 man ascii을 참조하십시오. 그렇지 않으면 인터넷에서 테이블을 확인하십시오 (예 : http://man-ascii.com/).

MySQL에서 문자열의 hexdump는 HEX() 함수 응용 프로그램에서 가져옵니다.

POSIX 쉘에서
SELECT HEX(one) FROM test 

, 16 진 덤프는 당신이 C 이스케이프 시퀀스로 변환하기에 충분 일반적인 공백을 위해, 하드 코어 될하지 않으려면

od -t x1 temp/test.csv 

을 사용하여 생성됩니다 (예를 들어,당신의 선택의 텍스트 편집기를 사용 EOL 유형을 식별하고 당신에게시키는에 어쩌면

더 간단한 (하지만 일반적으로 더 열심히 설명하는) 방법을 사용하여 캐리지 리턴)에 대한 \r. CSV는 일반 텍스트 형식입니다 (바이너리 형식과 달리). 예 : Vim에서 파일을 열고 se ff?을 실행하십시오. <EOL-type> 여러 탈출 수준을

공지 사항을주의 \r

에 대한 \r\n
  • mac에 대한 \n
  • dos에 대한

    • unix입니다 이것은 당신에게 fileformat=<EOL-type>을 보여줄 것의 시작 부분에서 내 대답 나는 wro 쿼리 만 실행하고 PHP 명령은 실행하지 마십시오. SQL에서 일부 문자는 특수하며 이스케이프 처리를 통해 문자 그대로 (문자열 내에서 인용) 받아야하고, 다른 문자는 이스케이프 (: \n)를 통해 특별한 의미를 얻습니다. PHP에서 SQL 쿼리는 다른 레벨의 이스케이프가 이루어지는 문자열 (그리고 다른 문자!)에 배치되어야합니다. 탈출의 또 다른 레벨은 예를 들어 쉘에서 PHP를 호출 할 때 php -r '…'으로.

      이스케이프 권한이 있는지 확인하려면 데이터베이스에 보내기 전에 쿼리를 인쇄하십시오.

      $query = '…'; 
      print $query; 
      #$result = mysql_query($query); 
      

      mysql API는 PHP 7.0

      오래된 mysql API (mysql_* 기능) deprecated in PHP 5.5했다

      removed in PHP 7.0 제거, PHP 5.5에서 사용되지 않습니다, 그것은 향후 버전에서 사용할 수 없습니다. choice of MySQL API에 대한 PHP 매뉴얼을 참조하십시오. 기타 relevantanswers도 참조하십시오.

  • 0

    은 CSV 파일에서 /// 발생을 제거합니다.

    CSV 파일이 ASCII 형식 (BINARY가 아닌)의 FTP 형식으로 업로드되었는지 확인하십시오.

    다음 쿼리 :

    mysql_query("LOAD DATA LOCAL INFILE 'temp/test.csv' 
          INTO TABLE test 
          FIELDS TERMINATED BY ',' 
          LINES TERMINATED BY '\\n' 
          IGNORE 1 LINES (one, two, three, four, five)"); 
    
    +0

    나는 당신이 말했듯이 CSV에서 ///로 모든 셀을 삭제하고, ASCII로 전송 모드를 전환하고, 업로드 된 CSV를 사용하여 내 쿼리를 복사/붙여 넣기했습니다. 이 방법으로 가져올 행은 없습니다. –

    +0

    몇 분 전에 대답을 업데이트했습니다. 'n'('LINES TERMINATED BY '\\ n'') 전에 두 개의 슬래시를 사용하여 업데이트 했습니까? –

    +0

    예, 아무 소용이 없었습니다. –