【发布时间】:2017-11-08 16:05:44
【问题描述】:
我有一个 csv 文件,每行开头都有一个文本字符串,在另一个长 XML 字符串开始之前。下面是一行,为方便起见,我将其格式化为 XML。
0b51b828-9416-4933-80ad-dd44ae2377b5<Company xmlns="abcd">
<Employee>
<Id>999999</Id>
<Name>Hulk</Name>
<Email>hulk@smash.com</Email>
</Employee>
<ApplicationName/>
<Identifier/>
<Headquarter>
<City>XYZ</City>
<House>123</House>
</Headquarter>
</Company>
我需要提取起始文本,直到 xml 开始的“
<Record> -- adding parent xml enclosure
<Parent_id>0b51b828-9416-4933-80ad-dd44ae2377b5</Parent_id> -- for reference
<Company xmlns="abcd">
<Employee>
<P_id>0b51b828-9416-4933-80ad-dd44ae2377b5</P_id> -- replicating p_id under each xml tag groups
<Id>999999</Id>
<Name>Hulk</Name>
<Email>hulk@smash.com</Email>
</Employee>
<ApplicationName/>
<Identifier/>
<Headquarter>
<P_id>0b51b828-9416-4933-80ad-dd44ae2377b5</P_id> -- same here
<City>XYZ</City>
<House>123</House>
</Headquarter>
</Company>
</Record>
我假设它需要多次迭代才能实现这一点,但我对任何想法持开放态度。可用的工具是 shell、map reduce 或任何在文件的每一行上执行此操作的有效方法。
谢谢!
【问题讨论】:
-
输入数据实际上是什么样的?真的都在一条线上吗?
-
是的..它是一个 csv。每行开头都有一个唯一标识符,后跟 XML 字符串。像这样:0b51b828-9416-4933-80ad-dd44ae2377b5
999999 Hulk hulk@smash.com电子邮件> XYZ 123 -
好吧,如果有帮助的话,简而言之,我正在尝试根据字符串位置和字符序列将具有结构良好的 xml 字符串的 csv 转换为另一个外部 xml。
-
这不是真正的 CSV,不是吗?前导数据和 XML 的第一个尖括号之间是否有逗号(或其他分隔符)?这些问题与解决这个问题无关,但请考虑一下您如何谈论您的数据。 CSV 是一种定义明确的文件格式,并且此数据似乎不是 CSV 数据。
-
@glennjackman 道歉。我不应该指定 csv。它应该被视为一个常规文本文件,它实际上是一个配置单元表的底层文本文件。每个字段由“^A”分隔并以 $ 结尾。 ------------------ 配置单元表定义包括:ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe' STORED AS INPUTFORMAT 'org.apache。 hadoop.mapred.TextInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
标签: shell csv unix apache-spark mapreduce