Talend에서 Excel 파일 로드

소개



엑셀 파일을 Talend로 읽어 집계하려고 했던 곳
날짜 형식의 데이터가 Excel 측에서 설정된 형식과 다르기 때문에
비망록으로 남겨 둡니다.

환경




사용환경
버전


OS
Windows10

TalendOpenStudio
7.2.1

OpenJDK
11.0.4

Office365
1902년


준비된 엑셀 파일



ExcelTestData.xlsx
※확장자 「xlsx」파일

※작업 시간: 「End」-「Start」, 셀의 서식 설정: 사용자 정의(h:mm)
누적 시간: "1행 전의 작업 시간"+ "근무 시간", 셀 서식: 사용자 정의([h]:mm)

Talend에서 로드




  • tFileList 구성 요소에서 ExcelTestData.xlsx를 넣은 위치를 지정합니다.
  • tFileInputExcel 구성 요소에서 Excel 파일을 로드합니다.
  • Excel2007 파일 형식(xlsx) 읽기를 선택합니다.
  • 스키마에 열을 5개 설정합니다. (유형은 모두 String)

  • tLogRow 컴퍼넌트로, 표준 출력합니다.
  • 모드를 테이블로 만듭니다.


  • 실행



    TalaendStudio 실행 작업에서
    ジョブ readExcel を 11:35 05/10/2019 に開始しました。
    [statistics] connecting to socket on port 3421
    [statistics] connected
    .---------+----------------------------+----------------------------+----------------------------+----------------------------.
    |                                                          tLogRow_1                                                          |
    |=--------+----------------------------+----------------------------+----------------------------+---------------------------=|
    |newColumn|newColumn1                  |newColumn2                  |newColumn3                  |newColumn4                  |
    |=--------+----------------------------+----------------------------+----------------------------+---------------------------=|
    |1        |Tue Oct 01 09:30:00 JST 2019|Tue Oct 01 18:30:00 JST 2019|Sun Dec 31 09:00:00 JST 1899|Sun Dec 31 09:00:00 JST 1899|
    |2        |Tue Oct 01 09:00:00 JST 2019|Tue Oct 01 19:00:00 JST 2019|Sun Dec 31 10:00:00 JST 1899|Sun Dec 31 19:00:00 JST 1899|
    |3        |Tue Oct 01 09:00:00 JST 2019|Tue Oct 01 18:00:00 JST 2019|Sun Dec 31 09:00:00 JST 1899|Mon Jan 01 04:00:00 JST 1900|
    |4        |Tue Oct 01 09:30:00 JST 2019|Tue Oct 01 19:30:00 JST 2019|Sun Dec 31 10:00:00 JST 1899|Mon Jan 01 14:00:00 JST 1900|
    |5        |Tue Oct 01 13:30:00 JST 2019|Tue Oct 01 21:30:00 JST 2019|Sun Dec 31 08:00:00 JST 1899|Mon Jan 01 22:00:00 JST 1900|
    |6        |Tue Oct 01 09:30:00 JST 2019|Tue Oct 01 18:30:00 JST 2019|Sun Dec 31 09:00:00 JST 1899|Tue Jan 02 07:00:00 JST 1900|
    '---------+----------------------------+----------------------------+----------------------------+----------------------------'
    
    [statistics] disconnected
    
    ジョブ readExcel が 11:35 05/10/2019 に終了しました。 [終了コード=0]
    

    날짜 형식 정보



    Excel2007의 날짜 형식을 String 형식으로 읽으면
    "Tue Oct 01 09:30:00 JST 2019"
    라는 형태가 되었습니다.
    ※날짜 표시가 문자가 되어 있으므로, Locale를 지정하지 않으면
    문자열 ⇒ 날짜 변환이 불가능합니다.
    스키마에서는 패턴 지정 만 가능하기 때문에
    tFileInputExcel로 직접 날짜형에서는 읽을 수 없다고 생각됩니다.
    ※「Excel은, 날짜 정보를 파일 내부에서는 수치형으로서 값을 보관 유지하고 있어, 값이 0의 경우는 기준일로서, 통상은 「1899년 12월 31일(Excel 표기상은 1900년 1월 0) 일)"을 나타냅니다. '라는 것입니다.
    참고) 파일 내부 날짜의 기준 날짜 설정

    tJavaRow로 변환



    tFileInputExcel 컴퍼넌트의 뒤에 tJavaRow 컴퍼넌트를 추가해
    문자열을 날짜로 변환합니다.

  • 기본 설정
  • SimpleDateFormat sdfi = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy", Locale.US);
    SimpleDateFormat sdfo = new SimpleDateFormat("yyyy/MM-dd HH:mm:ss");
    // エクセル基準日
    String zeroDate="Sun Dec 31 00:00:00 JST 1899";
    long dateTimeZero = sdfi.parse(zeroDate).getTime();
    
    output_row.newColumn = input_row.newColumn;
    output_row.newColumn1 = sdfo.format( sdfi.parse( input_row.newColumn1 ) );
    output_row.newColumn2 = sdfo.format( sdfi.parse( input_row.newColumn2 ) );
    
    // 時間差
    long dateTimeDiff = sdfi.parse( input_row.newColumn3 ).getTime();
    long dateTimeAccm = sdfi.parse( input_row.newColumn4 ).getTime();
    
    output_row.newColumn3 = String.valueOf((dateTimeDiff - dateTimeZero )/ (1000 * 60 * 60 ) );
    output_row.newColumn4 = String.valueOf((dateTimeAccm - dateTimeZero )/ (1000 * 60 * 60 ) );
    

    ※엑셀 기준일(1899-12-31 00:00:00)부터, 시각차의 밀리 세컨드를 long로 취해
     (1000 * 60 * 60 )로 나누어 시간으로 변환합니다. 
  • 고급 설정
  • import java.util.Locale;
    

    결과



    tJavaRow에 상기를 설정해 실행하면, 아래와 같은 출력이 되었습니다.
    ジョブ readExcel を 21:44 05/10/2019 に開始しました。
    [statistics] connecting to socket on port 3829
    [statistics] connected
    .---------+-------------------+-------------------+----------+----------.
    |                               tLogRow_1                               |
    |=--------+-------------------+-------------------+----------+---------=|
    |newColumn|newColumn1         |newColumn2         |newColumn3|newColumn4|
    |=--------+-------------------+-------------------+----------+---------=|
    |1        |2019/10-01 09:30:00|2019/10-01 18:30:00|9         |9         |
    |2        |2019/10-01 09:00:00|2019/10-01 19:00:00|10        |19        |
    |3        |2019/10-01 09:00:00|2019/10-01 18:00:00|9         |28        |
    |4        |2019/10-01 09:30:00|2019/10-01 19:30:00|10        |38        |
    |5        |2019/10-01 13:30:00|2019/10-01 21:30:00|8         |46        |
    |6        |2019/10-01 09:30:00|2019/10-01 18:30:00|9         |55        |
    '---------+-------------------+-------------------+----------+----------'
    
    [statistics] disconnected
    
    ジョブ readExcel が 21:44 05/10/2019 に終了しました。 [終了コード=0]
    

    xls 파일의 경우



    확장자 xls 파일을 대상으로 비슷한 형식으로 로드한 경우,
    아래와 같이 되었습니다.
    ※tFileInputExcel 컴퍼넌트의 「Excel2007의 파일 형식(xlsx)을 읽는다」로부터 체크를 제외했습니다.
    ジョブ readExcel_Copy を 22:12 05/10/2019 に開始しました。
    [statistics] connecting to socket on port 3940
    [statistics] connected
    .---------+----------+----------+----------+----------.
    |                      tLogRow_1                      |
    |=--------+----------+----------+----------+---------=|
    |newColumn|newColumn1|newColumn2|newColumn3|newColumn4|
    |=--------+----------+----------+----------+---------=|
    |1        |9:30      |6:30      |9:00      |:00       |
    |2        |9:00      |7:00      |10:00     |:00       |
    |3        |9:00      |6:00      |9:00      |:00       |
    |4        |9:30      |7:30      |10:00     |:00       |
    |5        |1:30      |9:30      |8:00      |:00       |
    |6        |9:30      |6:30      |9:00      |:00       |
    |null     |null      |null      |null      |null      |
    '---------+----------+----------+----------+----------'
    
    [statistics] disconnected
    
    ジョブ readExcel_Copy が 22:12 05/10/2019 に終了しました。 [終了コード=0]
    

    표준 시각의 서식은, 표시와 같은 서식으로 읽어들여 주실 수 있습니다만,
    newColumn4의 열은 파일 형식이 사용자 정의 ([h] : mm) 이었기 때문에
    시간을 읽을 수 없었던 것 같습니다.
    ※엑셀의 표시대로 읽어 주는 것은 편합니다만,
    읽을 수 없는 경우가 있는 것은, 서식이 엉망인 파일을 취급하는 경우에는 힘들군요.

    좋은 웹페이지 즐겨찾기