2011-07-03 3 views
2

고정 길이 텍스트 파일을 MySQL 테이블로 변환해야합니다.
가장 큰 문제는 각 줄마다 여러 개의 셀이 포함되어 있으며 파일을 보내는 방법과 변환하려는 주된 이유입니다.고정 길이 텍스트 파일을 SQL로 변환

셀은 모두 특정 길이입니다. 그러나 모두 한 줄에 포함됩니다.

예를 들어, 선의 처음 3 위치 (1 - 3)는 IRT이고 다음 3 위치 (4 - 6)는 다음 5 위치 (7-11)가 FSC 등의 IFTC입니다.

파일에 최대 300 줄의 레코드가 포함될 수 있으므로 SQL 테이블로 직접 가져올 수있는 쉬운 방법이 필요합니다.

나는 솔루션을 찾으려고 몇 시간 동안 인터넷을 검색해 왔지만 쉼표로 구분하지 않으면 아직 작동중인 해결책을 찾을 수 없습니다.

가능하면이 솔루션을 PHP에 코딩하고 싶습니다. 누군가가 나에게 함수명을 줄 수 있다면 이것을 수행하는 데 필요한 함수를 사용하는 법을 배우려는 긴 마당을 기꺼이하겠다. 사람들이 내 코드를 작성하지 않을 것으로 기대한다.

+0

그럼 당신이 \의 n''에 의해 분할 수 또는'\ 연구 \ n' 얻을 수 있도록 "행"그럼 당신이 을 할 각 행의 부분을 얻기 위해 SUBSTR()를 사용할 수 있습니다 및 –

+0

삽입 ** LOAD DATA INFILE ** 사용 : http://dev.mysql.com/doc/refman/5.1/en/load-data.html –

+0

@ypercube : [LOAD DATA INFILE] (http : // dev.mysql.com/doc/refman/5.1/en/load-data.html) 설명은 필드를 구분하는 구분 기호가없는 고정 길이 필드를 처리하지 않습니다. –

답변

1

당신은 아마 그다지 좋아하지 않을 것이지만, 실제로 당신이 한 일을하는 쉬운 방법이 아닙니다. 오래 전 (1991 년경) 필자는 고정 길이, 구분되지 않은 파일을 다루는 도구 인 DBLDFMT ('데이터베이스로드 형식'용)를 작성했습니다. Informix 데이터베이스가 선호하는로드 형식을 생성하도록 조정되었습니다 (기본적으로 파이프 기호를 사용하여 필드를 구분하지만 명령 행 옵션이나 환경 변수를 사용하여 조정할 수도 있음). 그러나 이것은 LOAD DATA INFILE 명령을 사용하여보다 정상적으로 처리 할 수있는 구분 된 데이터를 작성할 수 있습니다.

DBLDFMT의 소스 코드를 원하면 전자 메일 (내 프로파일 참조)에 문의하십시오. 현재 버전 (2008 년 3.17 버전)은 CSV 출력을 직접 지원하지 않으므로 추가하기가 어려울 수 있지만 필요한 효과를 얻을 수는 있지만 그만큼 쉬울 것입니다.)

7

파일 :

testfile.txt (4 rows) 

AAA11111xx 
BBB22222yy 
CCC33333zz 
DDD 444 aa 

테이블 :

CREATE TABLE TestLoadDataInfile 
(a VARCHAR(3) 
, b INT(5) 
, c CHAR(2) 
) CHARSET = latin1; 

코드 :

LOAD DATA INFILE 'D:\\...\\testfile.txt' 
INTO TABLE TestLoadDataInfile 
FIELDS TERMINATED BY '' 
LINES TERMINATED BY '\r\n' ; 

결과 :

mysql> SELECT * FROM TestLoadDataInfile ; 
+-----+-------+----+ 
| a | b  | c | 
+-----+-------+----+ 
| AAA | 11111 | xx | 
| BBB | 22222 | yy | 
| CCC | 33333 | zz | 
| DDD | 444 | aa | 
+-----+-------+----+ 

이 시점에서 LOAD DATA INFILE 문서는 그리 좋지 않습니다 (고정 크기 필드). 다음은 관련 부품의 :

  • 값에 의해 BY와 FIELDS 동봉 종료 FIELDS 인 경우 모두 빈 (''), 고정 행 (분리되지 않은) 형식이 사용됩니다. 고정 행 형식을 사용하면 필드 사이에 구분 기호가 사용되지 않으며 필드 사이에 구분 기호가 사용되지 않습니다 (단, 줄 수는 종결 자입니다). 대신, 열 값 은 필드에 의 모든 값을 보유 할 수있을만큼 너비가 넓은 필드를 사용하여 읽고 쓰게됩니다.TINYINT, SMALLINT, MEDIUMINT, INT 및 BIGINT의 경우 표시되는 너비가 인 경우에도 너비는 각각 4, 6, 8, 11 및 20, 입니다.

라인 종료는 여전히 각각 에 사용됩니다. 한 줄에 필드가 모두 포함되어 있지 않으면 나머지 열은 기본값 인 값으로 설정됩니다. 라인 터미네이터가 없으면 이것을 ''로 설정해야합니다. 이 경우 텍스트 파일은 각 행의 모든 ​​필드가 포함 된 이어야합니다.

고정 행 형식은 나중에 설명 할 NULL 값 처리에도 영향을줍니다. 멀티 바이트 문자 집합을 사용하는 경우 고정 크기 형식이 이 아닌 노트 유의하십시오.


운반 (FIELDS 종료 모두 비어 BY FIELDS 동봉 때 사용되는) 고정 행 포맷

, NULL이 빈 문자열로 기록된다 NULL. 을 입력하면 문자열이 모두 문자열로 기록되므로 파일에 쓸 때 문자열이 NULL 값과 빈 문자열 ( )이 모두 구별되지 않습니다. 파일을 다시 읽을 때 두 가지를 구분할 수 있어야한다면 고정 행 형식을 사용하면 안됩니다.


경우가 LOAD 데이터 INFILE에서 지원되지 않습니다

  • 고정 크기의 행과 BLOB 또는 TEXT 컬럼 ( 모두 빈으로 둘러싸인 종료 필드와 필드). 고정 행 형식 와 로드 데이터를 사용자 변수가 디스플레이 폭이 없으므로 때

  • 사용자 변수를 사용할 수 없습니다.
+0

오, 재미있는! 나는 이것을 다음과 같이 정확하게 해석하면 읽을 수 있는가? 간단한 'b INT' 컬럼 ('b INT (5) '와는 대조적으로)이있는 테이블을 가지고 있다면, 5 바이트 문자로 데이터를로드 할 수 없다. INT 데이터? 그리고 열이 최대 9 자리까지 걸릴 수 있습니다 (테이블이'b INT (9) '로 생성되므로 열에 예약 된 문자 만 5 개만로드 할 수 없습니다). 따라서 DBMS에 임의의 고정 데이터를 읽을 수는 없으며 특정 테이블에 맞는 너비로 정확하게 포맷해야합니다. –

+1

@Jonathan : 방금 테스트 했으므로 맞습니다. CHAR 또는 VARCHAR 필드로 데이터를 읽은 다음 원하는 데이터 유형으로 CAST하십시오. –