Talend:将数据文件拆分为两个流/流(header_info,data_rows)

时间:2015-10-01 15:44:57

标签: talend

拜托,我不需要任何解决方案,只需提供一些关于如何解决的提示。无论如何,这是我正在解决的问题:

我有一个文件(bloomberg答案文件),其构建如下:

  • 我们有一个标题部分(我只对它感兴趣 START-OF-FIELDS [...] END-OF-领域;不同数量的领域!)
  • 然后是数据部分:START-OF-DATA [...] END-OF-DATA。每行的位置:unique_id|some_val|some_val|EXCH_CODE|ID_BB_GLOBAL|NAME|SECURITY_TYP|TICKER\n

缩短的示例文件:

START-OF-FILE
RUNDATE=20150921
PROGRAMFLAG=oneshot

DATEFORMAT=yyyymmdd_sep
FIRMNAME=dl111111
FILETYPE=pc
REPLYFILENAME=r150921020044_20426_01_00
SECMASTER=yes
DERIVED=yes
CREDITRISK=yes
USERNUMBER=1111111
WS=0
SN=111111
CLOSINGVALUES=yes
SECID=BB_GLOBAL
PROGRAMNAME=getdata

START-OF-FIELDS
EXCH_CODE
ID_BB_GLOBAL
NAME
SECURITY_TYP
TICKER
END-OF-FIELDS

TIMESTARTED=Mon Sep 21 01:01:18 BST 2015
START-OF-DATA
BBG004C5BLW2|0|5|LABUAN INTL FIN|BBG004C5BLW2|1MDB GLOBAL INVESTMENTS|EURO-DOLLAR|OGIMK|
BBG000MGZ064|0|5|HK|BBG000MGZ064|361 DEGREES INTERNATIONAL|Common Stock|1361|
BBG000QVRHX9|0|5|AV|BBG000QVRHX9|3BG EMCORE CONVRT GLB-A|Open-End Fund|EMBDGCA|
BBG000BP52R2|0|5|US|BBG000BP52R2|3M CO|Common Stock|MMM|
BBG0068TPTD9|0|5|TRACE|BBG0068TPTD9|51JOB INC|US DOMESTIC|JOBS|
BBG0069D1BR3|0|5|NOT LISTED|BBG0069D1BR3|51JOB INC|EURO-DOLLAR|JOBS|
BBG000BJD1D4|0|5|US|BBG000BJD1D4|51JOB INC-ADR|ADR|JOBS|
BBG008CTTWK1|0|5|FRANKFURT|BBG008CTTWK1|AABAR INVESTMENTS PJSC|EURO MTN|AABAR|
BBG008D4J9S9|0|5|FRANKFURT|BBG008D4J9S9|AABAR INVESTMENTS PJSC|EURO MTN|AABAR|
BBG008B2BXH2|0|5|SIX|BBG008B2BXH2|AARGAUISCHE KANTONALBANK|DOMESTIC|KBAARG|
BBG0016WJL30|0|5|LX|BBG0016WJL30|AB-AMERICAN INCOME PT-ATEURH|Open-End Fund|ABAATEH|
BBG006F3D598|0|5|BH|BBG006F3D598|ABBEY CAPITAL DAILY FUTURE-B|Fund of Funds|ABBDFUB|
END-OF-DATA
TIMEFINISHED=Mon Sep 21 01:03:22 BST 2015
END-OF-FILE

现在我的问题 如何将此文件拆分为2个流(field_names; data_rows)? 我的问题是:

  • 正则表达式组件仅适用于行级...
  • tFileInputMSDelimited确实让我无处可以......
  • 我不想手动解析文件(tJava)......还是我必须这样做?

感谢您提前提示, 马可

2 个答案:

答案 0 :(得分:0)

我使用tJavaFlex和一些Java代码。如果你看一下实际的代码,即使你真的不懂java,也不难理解它是如何工作的。

开始:

boolean header = false;
boolean data = false;
String headerData = "";
String line;

主:

line = input_row.line;
if(line.equalsIgnoreCase("START-OF-FIELDS") ) { header = true; }
if(line.equalsIgnoreCase("END-OF-FIELDS") ) { header = false; }
if(line.equalsIgnoreCase("START-OF-DATA") ) { data = true; }
if(line.equalsIgnoreCase("END-OF-DATA") ) { data = false; }

if(header && !line.equalsIgnoreCase("START-OF-FIELDS")) {
   headerData += line + "|";
}

if (data) {
  if(line.equalsIgnoreCase("START-OF-DATA")) {
   output_row.line = headerData.substring(0,headerData.length()-1); //remove the trailing delimiter.
  } else {
   output_row.line = line;
  }
} else {
   continue; //lets go to the next line.
}

结束:

//if you want to handle the header separately:
globalMap.put("headerData",headerData);

希望这有帮助。

答案 1 :(得分:0)

不需要java代码,看看这个非常简单的工作: enter image description here

通常,标题具有固定的行数,因此我们只需要使用行数:

  • tFileInputDelimited1:标题11和限制5
  • tFileInputDelimited2:标题20和页脚3

并且它工作正常,如果你有动态行位置,尝试找到这些位置,将它们保存在变量中然后根据变量使用此作业。你也可以回答我的回答here