如何使用Talend Data Integration读取其他列中存在一列数据的文件

时间:2014-11-26 08:54:42

标签: csv etl talend

我每天都会从CSV格式获取数据。

示例数据如下:

Emp_ID     emp_leave_id           EMP_LEAVE_reason             Emp_LEAVE_Status  Emp_lev_apprv_cnt

 E121          E121-         21 Head ache, fever, stomach-ache    Approved            16

 E139          E139_         5 Attending a marraige of my cousin  Approved            03

您可以在此处看到emp_leave_idEMP_LEAVE_reason列数据已移位/分散到下一列。

因此使用tFileInputDelimited和各种读取模式的问题我无法正确地将数据加载到我的目标数据库中。主要是我无法在Talend中使用该组件正确读取数据。

有没有办法可以正确解析此CSV以获取我想要的格式的数据?

1 个答案:

答案 0 :(得分:0)

这可能是TSV文件。不确定Talend,但uniVocity可以为您解析这些文件:

TsvDataStoreConfiguration tsv = new TsvDataStoreConfiguration("my_TSV_datastore");
tsv.setLimitOfRowsLoadedInMemory(10000);
tsv.addEntities("/some/dir/with/your_files", "ISO-8859-1"); //all files in the given directory path will accessible entities.

JdbcDataStoreConfiguration database = new JdbcDataStoreConfiguration("my_Database", myDataSource);
database.setLimitOfRowsLoadedInMemory(10000);

Univocity.registerEngine(new EngineConfiguration("My_ETL_Engine", tsv, database));
DataIntegrationEngine engine = Univocity.getEngine("My_ETL_Engine");

DataStoreMapping dataStoreMapping = engine.map("my_TSV_datastore", "my_Database");
EntityMapping entityMapping = dataStoreMapping.map("your_TSV_filename", "some_database_table");
entityMapping.identity().associate("Emp_ID", "emp_leave_id").toGeneratedId("pk_leave"); //assumes your database does not keep the original ids.
entityMapping.value().copy("EMP_LEAVE_reason", "Emp_LEAVE_Status").to("reason", "status"); //just copies whatever you need

engine.executeCycle(); //executes the mapping.

不要使用CSV解析器来解析TSV输入。它不会正确处理转义序列(比如\ t里面的值,你将获得转义序列而不是制表符),如果你的值中有引号,肯定会中断(CSV解析器会尝试查找结束引号字符并将继续读取字符,直到找到另一个引号)

披露:我是这个图书馆的作者。它是开源和免费的(Apache V2.0许可证)。