2013-01-16 4 views
0

대량 구문으로 텍스트 파일을 읽었지만 다른 문제가 발견되었습니다. 텍스트 파일에 동일한 헤더와 세부 사항이 있으므로 내 문제는 어떻게 처리 할 수 ​​있습니까? table1의 헤더와 table2의 세부 정보텍스트 파일을 SQL Server로 가져 오기

또 하나의 것은 모든 행 (헤더 및 세부 사항)을 넣기 위해 단지 field1을 작성하지만, 그 헤더에는 FIELDTERMINATOR = ‘|’이 있지만 헤더에는 7 개의 필드가 있으며 세부 사항에는 11 개의 필드가 있습니다. 내 세부 정보와 헤더를 넣을 정확한 필드가있는 테이블 하나.

이 텍스트 파일을 내가 읽고있다 예 :

HR | 001580/06 | RG | 2013년 11월 1일 12 : 00 | BG | 3573 | 001,580 IT | 001580/01 | 1 | 00147066 || 1200 | 852.3 | 830.3 | 1.35 | UNIDAD | 0 | 31/12/2014 00:00 IT | 001580/02 | 1 | 00147066 || 200 | 852.3 | 830.3 | 1.35 | UNIDAD | 1 | 2014 년 12 월 31 일 00:00 IT | 001580/03 | 1 | 00147066 || 100 | 852.3 | 830.3 | 1.35 | UNIDAD | 55 | 31/12/2014 00:00 IT | 001580/04 | 2 | 00254276 || 200 | 852.3 | 830.3 | 1.35 | UNIDAD | 0 | 31/12/2014 00:00 IT | 001580/05 | 3 | 00305359 || 1700 | 852.3 | 830.3 | 1.35 | UNIDAD | 0 | 31/12/2014 00:00 IT | 001580/06 | 3 | 00305359 || 300 | 852.3 | 830.3 | 1.35 | UNIDAD | 1 | 2011 년 12 월 31 일 0시

이 은

CREATE TABLE #temp 
(
    campo1 VARCHAR(max) 
) 
BULK INSERT #temp 
FROM ” 
WITH 
(
    FIELDTERMINATOR = ‘|’, 
    ROWTERMINATOR = ‘\n’ 
) 

이 전나무는 헤더

SELECT * 
FROM #temp 
WHERE SUBSTRING(campo1,1,2) = ‘HR’ 

이 전나무는이 세부

0,123,516위한 쿼리입니다 쿼리 ... 내가 가지고있는 쿼리입니다
SELECT * 
FROM #temp 
WHERE SUBSTRING(campo1,1,2) = ‘IT’ 

머리글과 세부 정보 필드는 어떻게 구분합니까?

+1

그것은 당신이 whos는 요청하는지 이해하는 것은 매우 어렵다. 당신은 값으로 문자열을 분할로 그들에게 여러 테이블을 삽입하려고합니까? 내가 그렇게 할 수 때까지 나 방법을 이해합니다 ...하지만 난 결국 나를 도와하려고 ... 감사 대답을 얻었다 위해 내가 아는 –

+0

엡 종류 어렵다. – GaboBigale

답변

0

Pondlife에게 조언 해 주셔서 감사합니다. 제 질문에 대한 답을 얻었습니다. 여기 있습니다. 우리는 내가 같은 시간에 헤더와 세부

HR을 가지고이 텍스트 파일을 알고뿐만 아니라

| 001580/06 | RG | 2013년 11월 1일 12 : 00 | BG | 3573 | 001580 | IT | 001580/01 | 1 | 00147066 || 1200 | 852.3 | 830.3 | 1.35 | UNIT | 0 | 31/12/2014 0시 IT | 001580/02 | 1 | 00147066 || 200 | 852.3 | 830.3 | 1.35 | UNIT | 1 | 31/12/2014 0시 IT를 | 001580/03 | 1 | 00147066 || 100 | 852.3 | 830.3 | 1.35 | UNIT | 55 | 31/12/2014 0시 IT | 001580/04 | 2 | 00254276 || 200 | 852.3 | 830.3 | 1.35 | UNIT | 0 | 31/12/2014 0시 IT | 001580/05 | 3 | 00305359 || 1700 | 852.3 | 830.3 | 1.35 | UNIT | 0 | 31/12/2014 0시 IT를 | 001580/06 | 3 | 00305359 || 300 | 852.3는 | 830.3 | 1.35 | UNIT | 1 | 0시

31/12/2014 그래서 내가 수행해야합니다

,536,913,632 10
  1. 하면 파일
  2. 넣은 다음 먼저 내가 테이블을 생성 단계와 내용은 표
  3. 삽입 표 2에 상세히

에 헤더를 읽어 A I는 SQL BulkInsert

CREATE TABLE #ImportData 
(
    Field VARCHAR(max) 
) 
-- Insert the data into the first table 
BULK INSERT #ImportData 
FROM 'PATH FILE' 
WITH 
( 
    ROWTERMINATOR = '\n' 
) 
사용

내가 이런 식으로 뭔가를 얻었다. (|)


우리는이 구분이있는 행이 볼, 즉, 각 테이블의 필드 의미 (HR - 헤더, IT - 세부)

은 다음 나의 두 번째와 세 번째 단계를 위해 내가 삽입 필요 각 테이블에 행,하지만 또한 내가 각 행의 각 필드를 구분해야합니다, 그래서 문자열과 구분 기호를 받아 내 문자열의 각 필드에있는 테이블을 반환하는 프로 시저를 작성, 나는 동적으로 필드를 만들었습니다. 프로 시저를 만들려면 당신이 그것을 만들 수 있습니다

당신은 그 다음 첫 번째 SET QUOTED_IDENTIFIER OFF 를 실행해야합니다. 프로 시저를 실행하고 아직 잘 우리가 완료되지이

같은 것을 얻을 수 있습니다 위해 내가 세 첫째 줄에 주석을 참조하면

--EXEC spSplit 
-- @InputString = 'IT|001580/01|1|00147066||1200|852.3|830.3|1.35|QUANTITY|0|31/12/2014 00:00', -- VARCHAR(max) 
-- @Delimiter = '|' -- VARCHAR(50) 

--SET QUOTED_IDENTIFIER OFF 
ALTER PROCEDURE spSplit 
-- ============================================= 
-- Author:  Gabriel Jiménez 
-- Create date: 2013-01-16 
-- Description: Procedimiento creado para retornar 
-- valores de cada campo de una cadena delimitada 
-- ============================================= 
    @InputString NVARCHAR(max), 
    @Delimiter  VARCHAR(50) 

AS 
BEGIN 

    SET QUOTED_IDENTIFIER OFF 

    CREATE TABLE #Items (Field1 VARCHAR(max)) 

    DECLARE @Item   VARCHAR(max) 
    DECLARE @ItemList  VARCHAR(max) 
    DECLARE @DelimIndex  INT 
    DECLARE @PositionField INT 
    DECLARE @SqlTable  VARCHAR(max) 
    DECLARE @SqlUpdate  VARCHAR(max) 

    SET @ItemList = @InputString 
    SET @DelimIndex = CHARINDEX(@Delimiter, @ItemList, 0) 
    SET @PositionField = 0 

    WHILE (@DelimIndex != 0) 
    BEGIN 

     SET @SqlTable = "ALTER TABLE #Items ADD Field" 
     SET @SqlUpdate = "UPDATE #Items SET Field" 

     -- Set positions Rows and Fields 
     SET @PositionField = @PositionField + 1 
     SET @Item = SUBSTRING(@ItemList, 0, @DelimIndex) 

     IF @PositionField = 1 
     BEGIN 
      -- Insert the first data into the first field created on the table 
      INSERT INTO #Items (Field1) VALUES (@Item) 
     END 
     ELSE 
     BEGIN 
      -- Create a dynamic table for the @InputString 
      SET @SqlTable = @SqlTable + CONVERT(VARCHAR, @PositionField)+ " VARCHAR(MAX)" 
      EXEC(@SqlTable) 

      SET @SqlUpdate = @SqlUpdate + 
       CONVERT(VARCHAR, @PositionField) + " = '" + 
       CONVERT(VARCHAR, @Item) +"'" 
      EXEC(@SqlUpdate) 

     END 

     -- Set @ItemList = @ItemList minus one less item 
     SET @ItemList = SUBSTRING(@ItemList, @DelimIndex+1, LEN(@ItemList)[email protected]) 
     SET @DelimIndex = CHARINDEX(@Delimiter, @ItemList, 0) 

    END -- End WHILE 

    IF @Item IS NOT NULL -- At least one delimiter was encountered in @InputString 
    BEGIN 
     SET @SqlTable = "ALTER TABLE #Items ADD Field" 
     SET @SqlUpdate = "UPDATE #Items SET Field" 
     SET @SqlTable = @SqlTable + CONVERT(VARCHAR, @PositionField+1)+ " VARCHAR(MAX)" 
     EXEC(@SqlTable) 

     SET @SqlUpdate = @SqlUpdate + 
      CONVERT(VARCHAR, @PositionField+1) + " = '" + 
      CONVERT(VARCHAR, @ItemList) +"'" 
     EXEC(@SqlUpdate) 

    END 
    -- No delimiters were encountered in @InputString, so just return @InputString 
    ELSE 
    BEGIN 
     SET @SqlTable = "ALTER TABLE #Items ADD Field" 
     SET @SqlUpdate = "UPDATE #Items SET Field" 
     SET @SqlTable = @SqlTable + CONVERT(VARCHAR, @PositionField+1)+ " VARCHAR(MAX)" 
     EXEC(@SqlTable) 

     SET @SqlUpdate = @SqlUpdate + 
      CONVERT(VARCHAR, @PositionField+1) + " = '" + 
      CONVERT(VARCHAR, @InputString) +"'" 
     EXEC(@SqlUpdate) 

    END 

    SELECT * FROM #Items 

    SET QUOTED_IDENTIFIER ON 
END -- End Procedure 
GO 

, 우리는 파일을 읽고, 우리는을 반환 절차를 작성 이제 우리는 그것을 위해 나는 각 테이블의 필드를 알고 다음에 커서 내 #ImporData 테이블에서 읽을 각 행에 대해 생성 두 개의 정적 필드 '원인과 임시 테이블을 생성, 필드는 각 테이블에 삽입해야합니다.

CREATE TABLE #Header 
(
    Field1 VARCHAR(max), 
    Field2 VARCHAR(max), 
    Field3 VARCHAR(max), 
    Field4 VARCHAR(max), 
    Field5 VARCHAR(max), 
    Field6 VARCHAR(max), 
    Field7 VARCHAR(max), 
    Field8 VARCHAR(max) 
) 
-- Detail table is for the detail items 
CREATE TABLE #Detail 
(
    Field1 VARCHAR(max), 
    Field2 VARCHAR(max), 
    Field3 VARCHAR(max), 
    Field4 VARCHAR(max), 
    Field5 VARCHAR(max), 
    Field6 VARCHAR(max), 
    Field7 VARCHAR(max), 
    Field8 VARCHAR(max), 
    Field9 VARCHAR(max), 
    Field10 VARCHAR(max), 
    Field11 VARCHAR(max), 
    Field12 VARCHAR(max) 
) 

DECLARE @Field NVARCHAR(max) 
DECLARE Header CURSOR   
    FOR SELECT Field 
     FROM #ImportData 
     WHERE SUBSTRING(Field,1,2) = 'HR' 
OPEN Header 
FETCH NEXT FROM Header INTO @Field 

WHILE @@FETCH_STATUS = 0   
    BEGIN 
     INSERT INTO #Header 
     EXEC spSplit @Field, '|' 
     FETCH NEXT FROM Header INTO @Field 
    END        
CLOSE Header 
DEALLOCATE Header 

--Detail 
--DECLARE @f NVARCHAR(max) 
DECLARE Detail CURSOR   
    FOR SELECT Field 
     FROM #ImportData 
     WHERE SUBSTRING(Field,1,2) = 'IT' 
OPEN Detail 
FETCH NEXT FROM Detail INTO @Field 

WHILE @@FETCH_STATUS = 0   
    BEGIN 
     INSERT INTO #Detail 
     EXEC spSplit @Field, '|' 
     FETCH NEXT FROM Detail INTO @Field 
    END        
CLOSE Detail 
DEALLOCATE Detail 

--SELECT * FROM #ImportData 
SELECT * FROM #Header 
SELECT * FROM #Detail 

DROP TABLE #ImportData 
DROP TABLE #Header 
DROP TABLE #Detail 

당신이있어 동일한 쿼리에있는 모든 조각 후 놓으면 그.

는 내가 필요로.


는 다시 한번 감사 Pondlife 나에게 분할에 대한 조언을 제공합니다.

+0

...미안, 내가 각 쿼리에 대한 결과를 어떻게 넣을 수 있을까? – GaboBigale

0

두 가지 옵션 (최소)가 있습니다

  1. 분할 SQL 서버 외부에서 두 개의 별도의 파일로 파일, 선호하는 스크립트 언어를 사용하여; 하나는 헤더 행과 하나는 세부 행이 있습니다. 그리고 별도로 패키지 개인적으로

내가 옵션 1을 사용하는 것이 내에서 두 개의 데이터 흐름에 파일을 분할하고 각각을 처리하기 위해 두 개의 서로 다른 테이블

  • 사용 SSIS 및 스크립트 작업에로드 두 BULK INSERT 문을 사용, 훨씬 쉽습니다. 임시 테이블에 데이터를로드 할 이유가 없습니다.이 데이터를로드하기위한 영구 테이블을 만들 것입니다. 그것은 훨씬 쉽게 작업 할 수 있습니다.

  • +0

    당신은 나에게 내가 수행하려고하는 것에 대해 대답을 넣고 몇 분 덕분에 ... 내가 할 수있는 방법에 대한 약간의 조언을 제공합니다. – GaboBigale

    +0

    죄송합니다 나는 거의 잊어 버렸습니다. 답변 감사합니다. 내가 거기에 이미지를 삽입 할 수 없습니다 어떤 이유 – GaboBigale

    관련 문제